JSF-selectOneMenu中的f:converter和converter标记之间的区别

时间:2019-07-18 02:36:29

标签: jsf icefaces

我正在使用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的解释。如果使用后一种实现,这种情况将不复存在。

0 个答案:

没有答案