Ich fülle ein Formular mit Daten aus einem CompoundPropertyModel
. Meine TextArea
und DateTextField
erhalten ihren Wert, indem sie den Namen des Felds des Modells als die ID verwenden, so dass es nach einem Modell in seinen Eltern sucht und den Wert durch Reflexion findet, wie in https://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.html beschrieben. Aber ich bekomme es nicht funktioniert für meine DropDownChoice
. Der Wert bleibt null.Wicket: Einstellungswert von DropDownChoice mit CompoundPropertyModel
Würde gerne hören, wenn jemand weiß, was ich falsch mache. Derzeit habe ich ein Workarround, wo ich meinem DropDownChoice
Konstruktor einen PropertyModel
von FotoGroep
gebe.
Klasse:
public class ImageControlForm<T extends Foto> extends StatelessForm<Foto> {
private TextArea<String> beschrijving;
private DateTextField datum;
private DropDownChoice<FotoGroep> groep;
public ImageControlForm(String id, CompoundPropertyModel<Foto> fotoModel) {
super(id, fotoModel);
setMultiPart(true);
setDefaultModel(fotoModel);
add(maakBeschrijvingField());
add(maakDatumField());
add(maakGroepField());
}
private TextArea<?> maakBeschrijvingField() {
beschrijving = new TextArea<>("beschrijving");
return beschrijving;
}
private DateTextField maakDatumField() {
datum = new DateTextField("datum", "d/M/yy");
datum.add(new DatumPicker());
return datum;
}
private DropDownChoice<FotoGroep> maakGroepField() {
Order sortOrder = Helper.createOrder("naam", SortOrder.ASC);
List<FotoGroep> fotoGroepen = databaseService.getPictureGroups(sortOrder);
groep = new DropDownChoice<>("fotoGroep", fotoGroepen, new ChoiceRenderer<FotoGroep>("naam", "fotoGroepId"));
groep.isRequired();
return groep;
}
Foto:
@Entity
@Table(name = "XS_FOTO")
public class Foto extends BasisModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "FOTO_ID")
private Long fotoId;
@Column(name = "BESCHRIJVING", nullable = true)
private String beschrijving;
@Column(name = "DATUM", nullable = true)
@Temporal(TemporalType.DATE)
private Date datum;
@ManyToOne
@JoinColumn(name = "FOTO_GROEP_ID", nullable = false)
private FotoGroep fotoGroep = new FotoGroep(Long.valueOf(12));
(getters and setters)
FotoGroep:
@Entity
@Table(name = "XS_FOTO_GROEP")
public class FotoGroep extends BasisModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "FOTO_GROEP_ID")
private Long fotoGroepId;
@Column(name = "NAAM", nullable = false)
private String naam;
@Override
public boolean equals(Object object) {
return (this.getFotoGroepId().equals(((FotoGroep)object).getFotoGroepId()));
}
@Override
public int hashCode() {
return Objects.hash(fotoGroepId, naam, beschrijving, datum);
}
(getters and setters)
Wie gewünscht, ich zwingende equals
und hashCode
versucht, aber ohne Erfolg. Ich debuggte und die foto.fotoGroep.fotoGroepId
ist die gleiche wie die einzige fotoGroep.fotoGroepId
in der List<FotoGroepen>
. Beide FotoGroep
sind zur Laufzeit sogar die gleiche Bean. Mein Komponententest hat dieselbe FotoGroep
in der Liste wie im Modell.
bearbeiten, möglich schlechte Unit-Test (?): Ich testete den Wert meiner DropDownChoice
mit:
assertEquals("456", formTester.getTextComponentValue("fotoGroep"));
Der Wert gehalten Rückkehr Null. ABER, wenn ich die HTML überprüfen, kann ich sehen, dass die richtige Option ausgewählt ist:
<select wicket:id="fotoGroep" name="fotoGroep" disabled="disabled">
<option value="123">naam</option>
<option value="123">naam</option>
<option value="123">naam</option>
<option value="123">naam</option>
<option value="123">naam</option>
<option value="123">naam</option>
<option selected="selected" value="456">naam</option>
</select>
Könnte jemand dieses Verhalten erklären? Bei Verwendung einer PropertyModel
innerhalb meiner DropDownChoice
legt es auch den Wert, aber nicht bei der Modellvererbung.
wenn der Wert nicht in der Drop-Down-Problem wahrscheinlich mit Equals und Hashcode-Methode festgelegt. Es sieht kein Problem Ihr Code immer noch nicht empfehlen, Eigenschaftsmodell zu verwenden, da Sie CompoundProperty-Modell zuweisen. – soorapadman
@soorapadman Ich habe gleich und HashCode override hinzugefügt, aber das Problem bleibt. Ich habe sie meinem Post hinzugefügt. Könnten Sie das überprüfen? –
@WesleyDeKeirsmaeker das Vergleichen von 'Long' mit' == 'funktioniert nur für einen bestimmten Bereich, der intern zwischengespeichert wird. Zum Beispiel wird 'Long.valueOf (9999) == Long.valueOf (9999)' false zurückgeben.Sie müssen 'equals' verwenden oder in primitiven Typ umwandeln, um '==' –