以下示例:
<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不会呈现选定属性,并且大多数浏览器将预先选择第一个非禁用值。坏。
我以为我可以使用转换器轻松更改它,将空字符串转换为null
在getAsObject
。但在这种情况下,转换器不会被调用。
有谁知道为什么?
我知道我可以使用javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
更改此行为
但这会导致其他领域的其他问题。
答案 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;
}