在selectOneMenu中没有为空字符串调用JSF Converter

时间:2014-04-17 07:02:33

标签: java jsf jsf-2

以下示例:

<h:selectOneMenu value="#{bean.value}">
    <f:selectItem itemValue="#{null}" itemDisabled="#{true}" noSelectOption="#{true}" itemLabel="choose one" />
    <f:selectItem itemValue="FEMALE" itemLabel="female" />
    <f:selectItem itemValue="MALE" itemLabel="male" />
    <f:converter converterId="myConverter" />
</h:selectOneMenu>

在初始加载时,bean的值为null,因此选择了please-choose-option。如果用户没有选择任何内容,浏览器将不会提交值(禁用所选选项),JSF会将值设置为空字符串。如果再次呈现页面没有相应值,则JSF不会呈现选定属性,并且大多数浏览器将预先选择第一个非禁用值。坏。

我以为我可以使用转换器轻松更改它,将空字符串转换为nullgetAsObject。但在这种情况下,转换器不会被调用。

有谁知道为什么?

我知道我可以使用javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL更改此行为 但这会导致其他领域的其他问题。

1 个答案:

答案 0 :(得分:0)

我通过手动设置selected-attribute解决了我的问题:

<f:selectItem itemValue="#{null}" itemDisabled="#{true}" noSelectOption="#{true}" itemLabel="choose one" />
  <f:passThroughAttributes value="#{bean.attributes}" />
</f:selectItem>

public Map<String, String> getAttributes() {
    Map<String, String> attributes = new HashMap<>();
        if (value == null || "".equals(value)) {
           attributes.put("selected", "selected");
        }
    }   
    return attributes;
}