代码之家  ›  专栏  ›  技术社区  ›  Wesley De Keirsmaeker

Wicket:使用CompoundPropertyModel设置DropDownChoice的值

  •  0
  • Wesley De Keirsmaeker  · 技术社区  · 7 年前

    我正在用一个 CompoundPropertyModel . 我的 TextArea DateTextField 通过使用模型字段的名称作为Id来获取其值,这样它将在其父对象中查找模型,并通过反射找到值,如中所述 https://ci.apache.org/projects/wicket/guide/6.x/guide/modelsforms.html . 但我没能让它为我的 DropDownChoice . 该值保持为空。

    如果有人知道我做错了什么,我很乐意听听。目前有一个工作区,我在那里 PropertyModel FotoGroep 给我的 下拉选择 构造函数。

    类别:

    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)
    

    根据要求,我尝试覆盖 equals hashCode foto.fotoGroep.fotoGroepId 与唯一相同 fotoGroep.fotoGroepId List<FotoGroepen> . 二者都 福托格罗普 甚至在运行时也是同一个bean。我的单元测试结果是一样的 福托格罗普 在模型中的列表中。

    编辑,可能的错误单元测试(?): 我在测试我的 下拉选择 使用:

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

    该值一直返回Null。 但是 当我检查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>
    

    有人能解释一下这种行为吗?当使用 属性模型 在我的 下拉选择 它还设置值,但在使用模型继承时不设置。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Wesley De Keirsmaeker    7 年前

    我在测试 DropDownChoice

    我在测试DropDownChoice的价值:

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

    但在我的例子中,这个值从未设置过, 但是 选择了正确的选项!我已将测试更改为:

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

    测试将采用DropDownChoice,设置您期望的值,然后比较两者的模型。