2017-11-14 6 views
0

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.

+0

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

+0

@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? –

+0

@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 '==' –

Antwort

3

Ich habe DropDownChoice falsch getestet.

Ich testete den Wert des DropDownChoice:

assertEquals("456", formTester.getTextComponentValue("fotoGroep")); 

Aber in meinem Fall war dieser Wert nie gesetzt, ABER die richtige Option ausgewählt wurde!

DropDownChoice<FotoGroep> dropDownChoice = (DropDownChoice)tester.getComponentFromLastRenderedPage("imageControlPanel:imageControlForm:fotoGroep"); 
dropDownChoice.setModelObject(createFotoGroep); 
tester.assertModelValue("imageControlPanel:imageControlForm:fotoGroep", dropDownChoice.getModelObject()); 

Der Test dauert die DropDownChoice, stellen Sie den Wert, den Sie erwarten und dann die Modelle der beiden vergleichen: Ich habe meine Prüfung geändert.

Verwandte Themen