Hi Jan,
Well my suspicion was correct, there was an NPE in my code. This raises again my question as of why wasn't this logged as an error? I have noticed that during events or binding, Spring RC has a tendency of sweeping some exceptions under the carpet...
Either they are not logged or one needs to specify DEBUG level in log4j to see the exception in the log. IMHO this is not good, exceptions should be logged when the level is set higher to say ERROR, one would not want to run a Spring RC with full DEBUG level...
Obviously, I may be doing something wrong, so I think it would be interesting to specify the 'best practice' for error log and exception handling. Is there anything on the Wiki about this? How come the NPE is not handled by the exception handler? Should I add catch "everywhere"? (that is a rhetorical question...)
log4j.properties
Code:
log4j.rootCategory=DEBUG,Console,Default
log4j.category.net.objectlab=DEBUG
log4j.category.org=INFO
So I expect DEBUG (and higher) from my code and INFO (or higher) from org... ie Spring. Anyone who has tried to run with DEBUG level knows why it should not be done in a production environment... the amount of data is just... huge!
If I run with log4j.category.org=DEBUG, I can see the exception.
The NPE is caught by DefaultFormModel on line 286 and the logger.debug is called. IMHO it should call logger.error.
It then calls raiseBindingError but as far as the user can see, it may simply put a little red cross on the checkbox (which displays "required" like a validation... despite the fact that there are NO validation rule for that field!)
As a developer what should I do?
Do I need to override the raiseBindingError? Is there a way to log the exception as an error?
Could the DefaultFormModel log the exception as an error? or at least a warning?
Many thanks
Benoit
I enclose the stacktrace for ref:
Code:
[DEBUG,53377,DefaultFormModel,AWT-EventQueue-0] Exception occurred setting value
java.lang.NullPointerException
at net.objectlab.gui.forms.XXXForm.handleXXXChange(XXXXForm.java:104)
at net.objectlab.gui.forms.XXXXGeneralForm$4.propertyChange(XXXForm.java:77)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChangeEvent(AbstractValueModel.java:172)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChange(AbstractValueModel.java:144)
at org.springframework.binding.value.support.ValueHolder.setValue(ValueHolder.java:60)
at org.springframework.binding.value.support.AbstractValueModel.setValueSilently(AbstractValueModel.java:54)
at org.springframework.binding.form.support.FormModelMediatingValueModel.setValueSilently(FormModelMediatingValueModel.java:69)
at org.springframework.binding.value.support.AbstractValueModelWrapper.setValueSilently(AbstractValueModelWrapper.java:41)
at org.springframework.binding.form.support.DefaultFormModel$ValidatingFormValueModel.setValueSilently(DefaultFormModel.java:283)
at org.springframework.binding.value.support.AbstractValueModelWrapper.setValue(AbstractValueModelWrapper.java:37)
at net.objectlab.gui.forms.YYYYForm.handleNewRelationship(YYYYForm.java:347)
at net.objectlab.gui.forms.AbstractWithLogicForm.fetchZZZZ(AbstractWithLogicForm.java:408)
at net.objectlab.gui.forms.YYYYForm$1.propertyChange(YYYYForm.java:63)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChangeEvent(AbstractValueModel.java:172)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChange(AbstractValueModel.java:144)
at org.springframework.binding.value.support.ValueHolder.setValue(ValueHolder.java:60)
at org.springframework.binding.value.support.AbstractValueModel.setValueSilently(AbstractValueModel.java:54)
at org.springframework.binding.form.support.FormModelMediatingValueModel.setValueSilently(FormModelMediatingValueModel.java:69)
at org.springframework.binding.value.support.AbstractValueModelWrapper.setValueSilently(AbstractValueModelWrapper.java:41)
at org.springframework.binding.form.support.DefaultFormModel$ValidatingFormValueModel.setValueSilently(DefaultFormModel.java:283)
at org.springframework.binding.value.support.AbstractValueModelWrapper.setValue(AbstractValueModelWrapper.java:37)
at org.springframework.richclient.form.binding.swing.ComboBoxBinding$BoundComboBoxModel.setSelectedItem(ComboBoxBinding.java:155)
at org.springframework.richclient.form.binding.swing.ComboBoxBinding.updateSelectableItems(ComboBoxBinding.java:94)
at org.springframework.richclient.form.binding.swing.ComboBoxBinding$SelectableItemsChangeHandler.propertyChange(ComboBoxBinding.java:174)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChangeEvent(AbstractValueModel.java:172)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChange(AbstractValueModel.java:144)
at org.springframework.binding.value.support.ValueHolder.setValue(ValueHolder.java:60)
at net.objectlab.gui.forms.AbstractWithLogicForm.tryFetchRelationship(AbstractWithLogicForm.java:384)
at net.objectlab.gui.forms.WWWWForm$1.propertyChange(WWWWForm.java:63)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChangeEvent(AbstractValueModel.java:172)
at org.springframework.binding.value.support.AbstractValueModel.fireValueChange(AbstractValueModel.java:144)
at org.springframework.binding.value.support.ValueHolder.setValue(ValueHolder.java:60)
at org.springframework.binding.value.support.AbstractValueModel.setValueSilently(AbstractValueModel.java:54)
at org.springframework.binding.form.support.FormModelMediatingValueModel.setValueSilently(FormModelMediatingValueModel.java:69)
at org.springframework.binding.value.support.AbstractValueModelWrapper.setValueSilently(AbstractValueModelWrapper.java:41)
at org.springframework.binding.form.support.DefaultFormModel$ValidatingFormValueModel.setValueSilently(DefaultFormModel.java:283)
at org.springframework.richclient.form.binding.support.CustomBinding.controlValueChanged(CustomBinding.java:47)
at net.objectlab.gui.binder.StringSelectionFieldBinding.access$100(StringSelectionFieldBinding.java:32)
at net.objectlab.gui.binder.StringSelectionFieldBinding$1.propertyChange(StringSelectionFieldBinding.java:47)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:341)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:270)
at java.awt.Component.firePropertyChange(Component.java:7159)
at net.objectlab.gui.components.StringSelectionField.setValue(StringSelectionField.java:146)
at net.objectlab.gui.components.ZZZSelectionField.setSelection(ZZZSelectionField.java:93)
at net.objectlab.gui.components.ZZZSelectionField.validateCode(ZZZSelectionField.java:84)
at net.objectlab.gui.components.StringSelectionField$2.focusLost(StringSelectionField.java:102)
at java.awt.AWTEventMulticaster.focusLost(AWTEventMulticaster.java:172)
at java.awt.Component.processFocusEvent(Component.java:5380)
at java.awt.Component.processEvent(Component.java:5244)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1810)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:836)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:526)
at java.awt.Component.dispatchEventImpl(Component.java:3841)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)