Hier ist ein einfaches Beispiel für ein Problem, das ich oft erhalten, wenn sie mit CompoundPropertyModel in Wicket arbeiten:Zwingende Getter-Methode eines Objekts in CompoundPropertyModel
Das ist mein Unternehmen ist Item
mit seinem Modell ItemModel
und Controller ItemController
:
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
private long createdTimestamp;
public Item(long createdTimestamp) {
super();
this.createdTimestamp = createdTimestamp;
}
public long getCreatedTimestamp() {
return createdTimestamp;
}
public void setCreatedTimestamp(long createdTimestamp) {
this.createdTimestamp = createdTimestamp;
}
}
public class ItemModel extends CompoundPropertyModel<Item> {
private static final long serialVersionUID = 1L;
public ItemModel(Item object) {
super(object);
}
}
public class ItemController {
public static int getDuration(Item item) {
return Days.daysBetween(new DateTime(item.getCreatedTimestamp()), new DateTime()).getDays();
}
}
Nehmen wir an, ich möchte createdTimestamp und Dauer auf einem Panel anzeigen. Wenn ich so etwas tun:
public class ItemPanel extends GenericPanel<Item> {
private static final long serialVersionUID = 1L;
public ItemPanel(String id, ItemModel itemModel) {
super(id);
setModel(itemModel);
add(new Label("createdTimestamp"));
add(new Label("duration"));
}
}
Label-createdTimestamp würde als Long-Wert diplayed werden, denn das ist, was getCreatedTimestamp() Methode zurückgibt und Panel würde eine Ausnahme auslösen, weil es keine getDuration () Methode implementiert in Klasse Item
.
Eine mögliche Lösung hierfür ist ein Wrapper für die Klasse Item
, zu schaffen, die ItemView
genannt werden könnte:
public class ItemView implements Serializable {
private static final long serialVersionUID = 1L;
private Item item;
public ItemView(Item item) {
super();
this.item = item;
}
public Date getCreatedTimestamp() {
return new Date(item.getCreatedTimestamp());
}
public int duration() {
return ItemController.getDuration(item);
}
}
Es würde funktionieren, aber ich diese Lösung nicht gefällt, weil das Erstellen und Wrapper Klassen für all Ihre Entitäten können sehr zeitaufwendig sein, wenn Sie viele davon haben und viele Felder haben.
Item
hat bereits Wrapper, der ItemModel
heißt. Deshalb möchte ich Getter-Methoden in dieser Klasse erstellen und das Modell zwingen, sie zu verwenden. Hier
ist ein Beispiel dafür, was ich meine:
public class ItemModel extends CompoundPropertyModel<Item> {
private static final long serialVersionUID = 1L;
public ItemModel(Item object) {
super(object);
}
public Date getCreatedTimestamp() {
return new Date(getObject().getCreatedTimestamp());
}
public int duration() {
return ItemController.getDuration(getObject());
}
}
Aber in diesem Fall ist die Getter-Methoden würden durch das Modell außer Acht gelassen werden. Bisher habe ich noch nicht herausgefunden, wie man das Modell dazu zwingt, sie zu benutzen. Gibt es einen Weg, es zu tun?
+1 Danke, das ist was ich brauchte. Sie haben recht, dass ich IModel- als Parametertyp verwenden soll. Nach Ihrer Erklärung sehe ich, dass das Erstellen der Klasse ItemModel hier keinen Sinn ergibt, aber gibt es ein mögliches Szenario, in dem ich meine eigene Model-Klasse erstellen müsste? –
mvantroba
Ich habe eine Antwort zu meiner Antwort hinzugefügt. – svenmeier
Schöne Erklärung, es hat mir geholfen, das Konzept der Modelle besser zu verstehen. – mvantroba