Martin Makundi created WICKET-5772: -------------------------------------- Summary: LoadableDetachableModel caches null value if load() fails, bug in getObject() {attached = true;} Key: WICKET-5772 URL: https://issues.apache.org/jira/browse/WICKET-5772 Project: Wicket Issue Type: Bug Components: wicket Affects Versions: 7.0.0-M4, 6.18.0, 1.4.23 Reporter: Martin Makundi
If you have a LoadableDetachableModel whose load() operation fails at an instance, the LoadableDetachableModel will cache null value because getObject() method sets attached = true; before load() invocation has returned. This results in methods trusting LoadableDetachableModel using the null value for their operations which is logically incorrect as null might not be a legal value at all. Such behavior would result in unexpected difficult-to-debug behavior in depending components. Easy fix: Move: attached = true; after line: transientModelObject = load(); Test case: /** * LoadableDetachableModel must not return null as an attached value if load() * fails. */ public void testWhenLoadFails() { final LoadableDetachableModel<Void> loadableDetachableModel = new LoadableDetachableModel<Void>() { /** * @see org.apache.wicket.model.LoadableDetachableModel#load() */ @Override protected Void load() { throw new UnsupportedOperationException("Let's assume this fails for some reason."); } }; try { loadableDetachableModel.getObject(); fail(UnsupportedOperationException.class + " expected."); } catch (final UnsupportedOperationException e) { LoggerFactory.getLogger(LoadableDetachableModel.class).debug("Expected behavior due to " + UnsupportedOperationException.class); } try { assertNotSame(LoadableDetachableModel.class + " should not return null if it's load() has failed\n", null, loadableDetachableModel.getObject()); } catch (final UnsupportedOperationException e) { LoggerFactory.getLogger(LoadableDetachableModel.class).debug("Expected behavior due to " + UnsupportedOperationException.class); } } -- This message was sent by Atlassian JIRA (v6.3.4#6332)