我正在使用ICEFaces 3.3框架,但转换器有一个奇怪的问题。
下面的代码段将导致传递给setter的值变为空
<ice:setEventPhase events="ValueChangeEvent" phase="INVOKE_APPLICATION">
<ice:selectOneMenu id="obj" style="width: 120px;" value="#{MyClass.obj}" rendered="#{not objectBean.disabled}" partialSubmit="true" converter="#{MyControlClass.myCustomConverter}">
<f:selectItem itemValue="" />
<f:selectItems id="items" value="#{MyControlClass.itemList}"/>
</ice:selectOneMenu>
</ice:setEventPhase>
请注意,上面的转换器在MyControlClass中定义为变量(类型为MyCustomConverter)。
转换器修改之前
public class MyCustomConverter implements Converter {
private List<MyObject> objs;
public MyCustomConverter(List<MyObject> objs) {
this.objs = objs;
}
但是,当更改为下面时,该错误不再存在
<ice:setEventPhase events="ValueChangeEvent" phase="INVOKE_APPLICATION">
<ice:selectOneMenu id="obj" style="width: 120px;" value="#{MyClass.obj}" rendered="#{not objectBean.disabled}" partialSubmit="true">
<f:selectItem itemValue="" />
<f:selectItems id="items" value="#{MyControlClass.itemList}"/>
<f:converter converterId = "MyCustomConverter" />
</ice:selectOneMenu>
</ice:setEventPhase>
修改后 后的转换器
@FacesConverter("MyCustomConverter")
public class MyCustomConverter implements Converter {
private List<MyObject> objs;
public MyCustomConverter() {
super();
...business logic, get records and store it into objs...
}
我的问题
以上两个实现之间有区别吗?如果我使用第一个实现,则无法找到触发事件触发后该值为何在setter时变为null的解释。如果使用后一种实现,这种情况将不复存在。