In Component.setModelImpl(IModel) - rza
2014-07-29 16:37 GMT+02:00 Sven Meier <[email protected]>: > Hi, > > > > the setModel(CompoundPropertyModel ...) actually KEEPS the > FLAG_INHERITABLE_MODEL on true > > where is that? > > Sven > > > > On 07/29/2014 04:29 PM, Raoul Zander wrote: > >> Hi everyone, >> >> I think there is some kind of bug in the handling of CompoundPropertyModel >> (or any IComponentInheritedModel). >> >> In Component exists a Flag FLAG_INHERITABLE_MODEL - which is set to true >> whenever a model is inherited from a parent, so that the model can be >> nulled onDetach. Thing is: The same flag is set when a >> IComponentInheritedModel is set as default model (via >> setModelImpl(IModel)). >> >> This leads to exceptions with chained CompoundPropertyModels as in the >> following scenario: >> >> (With correct indention and code high lighting: >> http://pastebin.com/5iu0qhWw >> ) >> >> // POJOs (implements Serializable omitted) >> public class Game { >> private Data data; >> // getters / setters >> } >> >> public class Data { >> private Value value; >> // getters / setters >> } >> >> >> public class Value { >> private int number; >> // getters / setters >> } >> >> // Panels >> public class DataPanel extends GenericPanel<Data> { >> >> public DataPanel(String id) { >> super(id); >> } >> >> protected void onInitialize() { >> super.onInitialize(); >> >> setModel(new CompoundPropertyModel<Data>(getModel())); >> add(new ValuePanel("value")); >> } >> } >> >> public class ValuePanel extends GenericPanel<Value> { >> >> public ValuePanel(String id) { >> super(id); >> } >> >> protected void onInitialize() { >> super.onInitialize(); >> >> setModel(new CompoundPropertyModel<Value>(getModel())); >> add(new Label("number")); >> } >> } >> >> // and the page >> public class GamePage extends WebPage { >> >> protected void onInitialize() { >> super.onInitialize(); >> >> setDefaultModel(new CompoundPropertyModel<Game>(new Game())); >> // make Page stateful like it would happen with AJAX links and >> alike >> setStatelessHint(false); >> add(new DataPanel("data")); >> } >> } >> >> Markup is irrelevant. The first time the page loads correct but as soon as >> you refresh the page you'll get the error "No get method defined for >> class: >> class Game expression: number". >> Why that? Because the setModel(CompoundPropertyModel ...) actually KEEPS >> the FLAG_INHERITABLE_MODEL on true so that our custom set model will be >> nulled on the next detach. >> >> In my opinion this is a bug as FLAG_INHERITABLE_MODEL should be true if >> (and only if) the current component model was inherited - and not if it is >> *inheritable*. >> But on the other hand: Maybe i'm using the models the wrong way and >> there's >> a better way to achieve the same result (basically using >> CompoundPorpertyModels on different levels of an object graph) >> >> Kind regards, >> rza >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
