Wicket 1.8 DropDownChoice不';无法显示正确的模型对象

Wicket 1.8 DropDownChoice不';无法显示正确的模型对象,wicket,dropdownchoice,wicket-8,Wicket,Dropdownchoice,Wicket 8,我对DropDownChoice及其模型有意见。 所涉及的HTML是一个模式窗口,用户可以通过该窗口编辑对象的设置:第一个DDC在其模型更改时更改第二个DDC的列表,并且一切正常。问题是两个DDC都不显示保存的值,但它们显示关联列表中的第一项。 下面是一些代码: private DropDownChoice<Sala> salaDDC; private DropDownChoice<Sede> sedeDDC; private ArrayList<Sala>

我对DropDownChoice及其模型有意见。 所涉及的HTML是一个模式窗口,用户可以通过该窗口编辑对象的设置:第一个DDC在其模型更改时更改第二个DDC的列表,并且一切正常。问题是两个DDC都不显示保存的值,但它们显示关联列表中的第一项。 下面是一些代码:

private DropDownChoice<Sala> salaDDC;
private DropDownChoice<Sede> sedeDDC;
private ArrayList<Sala> listaSale;

private Sala sala = null; //they both get correctly initialized afterwards
private Sede sede = null;
[...]
//first DDC, with the "sede" list. 
//Its model is based on class Sede, and its list of choices is sediList, which is constant

    form.addOrReplace(sedeDDC = new DropDownChoice<>("sedeDDC", Model.of(sede), sediList);
    sedeDDC.add(new AjaxFormComponentUpdatingBehavior("change") {
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            listaSale = listSalePerSede.get(sedeDDC.getModelObject().getId());
            if (null != listaSale) {
                if (listaSale.isEmpty()) {
                    listaSale = new ArrayList<>();
                }
            } else {
                listaSale = new ArrayList<>();
            }
            target.add(salaDDC);
        }
    });
    sedeDDC.setDefaultModelObject(sede);
    sedeDDC.setModelObject(sede);

//second DDC, representing the "sala" list 
//Its model is based on Sala class, and its list of choices changes if the 
//other DDC model object changes, hence the PropertyModel model

    form.addOrReplace(salaDDC = new DropDownChoice<>("salaDDC", Model.of(sala), new PropertyModel(this, "listaSale")));
    salaDDC.setDefaultModelObject(sala);
    salaDDC.setModelObject(sala);
    salaDDC.setOutputMarkupId(true);
private-DropDownChoice-salaDDC;
私人下拉选择SEDDC;
私人ArrayList listaSale;
私有Sala-Sala=null//之后,它们都得到了正确的初始化
私有Sede Sede=null;
[...]
//第一个DDC,带有“sede”列表。
//它的模型基于Sede类,它的选择列表是sediList,它是常量
form.addOrReplace(sedeDDC=新的下拉选择(“sedeDDC”,Model.of(sede),sediList);
添加(新的AjaxFormComponentUpdateBehavior(“更改”){
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标){
listaSale=listSalePerSede.get(seddedc.getModelObject().getId());
if(null!=listaSale){
if(listaSale.isEmpty()){
listaSale=newarraylist();
}
}否则{
listaSale=newarraylist();
}
target.add(salaDDC);
}
});
setDefaultModelObject(sede);
setModelObject(sede);
//第二个DDC,代表“沙拉”列表
//它的模型基于Sala类,如果
//其他DDC模型对象发生了变化,因此出现了PropertyModel模型
form.addOrReplace(salaDDC=新的下拉选择(“salaDDC”,Model.of(sala),new PropertyModel(本“列表”));
setDefaultModelObject(sala);
setModelObject(sala);
salaDDC.setOutputMarkupId(true);
因此,假设您遇到这种情况:

  • sede1(包含沙拉1、沙拉2、沙拉3)
  • sede2(包含沙拉4、沙拉5)
“Sede”的意思类似于部门,“Sala”的意思类似于一个房间,所以对于每个部门,您可以有一个不同房间的列表

如果用户试图编辑设置为“sede1”和“sala2”的对象,对话框窗口将加载第一个DDC显示“sede1”(这是正确的,只是偶然),第二个DDC显示“sala1”(因为是与“sede1”关联的列表的第一个),而不是“sala2”。同样,如果对象的设置为“sede2”和“sala5”,DDCs将分别显示“sede1”(“sede”列表的第一项)和“sala4”(与“sede2”关联的列表的第一项),而模型对象是“sala5”。因此,用户在编辑相关对象时,暂时必须重新设置这两个字段的已保存值,这并不好


我已经做了一些调试,从我收集的数据来看,模型和默认模型总是正确的:DDC只是不显示它们,我不明白为什么。如果需要更多信息,请告诉我。

您使用
下拉选择
而不提供
ichoicerender
,因此Wicket使用
新的Choicerender()
,即没有
displayExpression
idExpression
参数


尝试使用
新的下拉选项(id、型号、列表、新的选择器(“名称”、“id”))
,其中
的“名称”
将是
显示表达式
的“id”
Sede
Sala
idExpression
您使用
DropDownChoice
而不提供
ichoicerender
,因此Wicket使用
新的choicerender()
,即不提供
displayExpression
idExpression
参数


尝试使用
新的下拉选项(id、型号、列表、新的选择器(“名称”、“id”))
,其中
的“名称”
将是
显示表达式
的“id”
Sede
Sala
idExpression
在进一步挖掘之后,我发现了两个不同的错误引用,这两个错误应该在以前的版本中得到了解决。我不是说这个错误仍然存在,也许我仍然遗漏了一些东西,但是这个错误的解决方法在我的案例中也起到了作用

作为模型使用的类似乎存在一些问题:如果它没有实现equals()和hashcode(),它的实例将无法由后台的ChoiceRenderer正确地相互比较。因此,出于绝望,我将hashcode()和equals()都添加到Sede和Sala类中,并且效果很好

参考资料的链接:


编辑:martin_g建议也很有效,因此我将其标记为正确答案。我将保留我以前的解决方案作为建议。

在进一步挖掘之后,我发现了两个不同的引用,指向一个错误,该错误在以前的版本中已解决。我不是说该错误仍然存在,也许我仍然遗漏了一些内容,但工作仍然有效在我的情况下,这个错误也起了作用

作为模型使用的类似乎存在一些问题:如果它没有实现equals()和hashcode(),它的实例将无法由后台的ChoiceRenderer正确地相互比较。因此,出于绝望,我将hashcode()和equals()都添加到Sede和Sala类中,并且效果很好

参考资料的链接:


编辑:martin_g的建议也很有效,因此我将其标记为正确答案。我将把以前的解决方案保留为建议。

谢谢你的提示,也许我会稍后再尝试一下。不管怎样,我还是成功了,我会很快发布答案。我尝试了你的建议,并且成功了。再次感谢你的提示,我不明白选择者是谁这是必要的,我认为这只是为了显示的目的…在这种情况下,类已经超过了