2017-11-14 5 views
0

とDropDownChoiceの設定値は、私はCompoundPropertyModelからのデータをフォームに記入しています。マイTextAreaDateTextField、それはそれの両親にモデルを探し、https://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.htmlで説明したように、反射によって価値がありますので、IDとしてモデルのフィールドの名前を使用して、値を取得します。 しかし私はこれを私のDropDownChoiceのために働かせません。値はnullのままです。ウィケット:CompoundPropertyModel

は、誰かが私が間違ってやっていることを知っているならば聞くのが大好きです。現在、私は私のDropDownChoiceコンストラクタにFotoGroepPropertyModelを与える代わりにworkarroundを持っています。

クラス:

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:

​​

要求されたとして、私はequalshashCodeを上書きしようとしたが、大成功なし。私はデバッグし、foto.fotoGroep.fotoGroepIdList<FotoGroepen>の中の唯一のfotoGroep.fotoGroepIdと同じです。 FotoGroepは実行時に同じBeanですらあります。私の単体テストは、Modelと同じリストに同じFotoGroepを置いています。

編集、可能性の悪いユニットテスト(?):値がNullを返すまま

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

: 私は私のDropDownChoiceの値をテストしていました。 しかし私はHTMLをチェックしたときに、私は右のオプションが選択されていることがわかります。

<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> 

誰かが、この動作を説明してもらえますか? DropDownChoiceの中にPropertyModelを使用している場合は、値を設定しますが、モデルの継承を使用しない場合は値を設定します。

+0

値が等しいとhashCodeメソッドと、おそらく問題がドロップダウンに設定されていない場合。あなたがまだcompoundpropertyモデルを割り当てているので、あなたのコードはまだプロパティモデルを使用することをお勧めしません。 – soorapadman

+0

@soorapadman私はequalsとhashCodeのオーバーライドを追加しましたが、問題はそのまま残ります。私はそれらを私のポストに加えました。確認できますか? –

+0

@WesleyDeKeirsmaekerは 'Long'と' == 'を比較すると、内部的にキャッシュされた特定の範囲に対してのみ動作します。たとえば、 'Long.valueOf(9999)== Long.valueOf(9999)'はfalseを返します。'==' –

答えて

3

私が間違っDropDownChoiceをテストしていました。

私はDropDownChoiceの値をテストしていた。

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

しかし、私の場合には、この値が設定されていなかった、しかし右のオプションが選択されました!テストは、DropDownChoiceを取る、あなたが期待している値を設定し、両方のモデルを比較します

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

:私はに私のテストを変更しました。

関連する問題