Hi,
I'm have a question about my application design and whether I should
pass a model to a panel or an id and create a new
LoadableDetachableModel in the panel. Here is a basic layout of my app:
 
I have taken out the non-relevant parts for brevity.
 
My domain model is basically as follows:
Base class is ARF. It has an owner, a keeper and a user. The owner,
keeper and user all have a correspondence address and a visiting
address.
 
The layout of my application reflects this. The main screen has 3 tabs,
one for owner, one for user and one for keeper. These tabs are panels. I
also defined one addressPanel to display all the addresses.
 
So when I am building my view, it is as follows:
 
On my page I create a LoadableDetachableModel as follows:
 
IModel<ARF> arfModel = new LoadableDetachableModel<ARF>() {
 @Override
 protected ARF load() {
  return arfService.load(arfId);
 }
}; 
 
I pass this model on to my tabs panel:
 
public class ArfPageTabsPanel extends Panel {
 public ArfPageTabsPanel(String id, IModel<ARF> arfModel) {
  super(id);
  add(new TabOwner("tabOwner", arfModel));
  add(new TabKeeper("tabKeeper", arfModel));
  add(new TabUser("tabUser", arfModel));
 }
}
 
The TabOwner class is as follows:
 
public class TabOwner extends Panel {
 public TabOwner(String id, IModel<ARF> arfModel) {
  super(id);
  
  add(new AddressPanel("correspondenceAddress", "Correspondentie-adres",
new PropertyModel<Address>(arfModel, "owner.correspondenceAddress")));
  add(new AddressPanel("visitingAddress", "Bezoekadres", new
PropertyModel<Address>(arfModel, "owner.visitingAddress")));
 }
}
 
the TabKeeper and TabUser classes are much the same as the TabOwner
class (probably I could do some code reuse here, I'll do that when
everything is working and I understand it all).
 
And then the AddressPanel is as follows:
 
public class AddressPanel extends Panel {
 public AddressPanel(String id, String addressHeader, IModel<Address>
addressModel) {
  super(id);
  add(new Label("addressHeader", addressHeader));
  add(new TextField<String>("street", new
PropertyModel<String>(addressModel, "street")));
  add(new TextField<String>("houseNr", new
PropertyModel<String>(addressModel, "houseNr")));
  add(new TextField<String>("houseNrExt", new
PropertyModel<String>(addressModel, "houseNrExt")));
  add(new TextField<String>("zipcode", new
PropertyModel<String>(addressModel, "zipcode")));
  add(new TextField<String>("city", new
PropertyModel<String>(addressModel, "city")));
 }
}
 
 
So I am nesting all my models here, since the underlying arfModel is a
LoadableDetachableModel and I don't want to get my panels and the main
view out of sync. The problem is however that sometimes there is no
owner/keeper/user and hence also no addresses for that relation. When I
do load an ARF that has a null keeper for example, my console is flooded
with the following message:
 
2009-11-20 17:42:02,274 WARN [AbstractTextComponent] Couldn't resolve
model type of
Model:classname=[org.apache.wicket.model.PropertyModel]:nestedModel=[Mod
el:classname=[org.apache.wicket.model.PropertyModel]:nestedModel=[Model:
classname=[com.bmw.preparer2.view.ArfPage$1]:attached=true:tempModelObje
ct=[com.bmw.preparer2.domain....@d737e3]]:expression=[user.visitingAddre
ss]]:expression=[city] for [MarkupContainer [Component id = city]],
please set the type yourself.

 

I am assuming that this has to do with that I am nesting my models and
that one of them is null. So in the AddressPanel I am creating a
PropertyModel where the passed on model is potentially null.

So my question is, how do I handle such a situation? Please advise.

Thanks very much, Jonck van der Kogel

Reply via email to