2014-04-17 30 views
0

空字符串下面的例子:JSF转换器不要求在selectOneMenu用于

<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所以请-选择选项被选中。如果用户不选择,浏览器将不会提交一个值(所选选项被禁用),JSF会将该值设置为空字符串。如果页面再次呈现,则没有相应的值,JSF将不会呈现selected属性,大多数浏览器将预先选择第一个非禁用值。坏。

我想我可以很容易地改变这与一个转换器将空字符串转换为nullgetAsObject。但在这种情况下,转换器不会被调用。

有人知道为什么吗?

我知道我可以用javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 更改此行为,但这会导致其他字段出现其他问题。

+0

我倾向于使用值“ - ”为“无选择”值。这是容易识别的服务器端,不可能导致冲突,它不是一个空字符串或空:) – Gimby

+0

谢谢,但不会帮助我:(值' - '也将被替换为空字符串。问题是select-element被禁用,所以浏览器不会提交一些东西,但JSF会改变它的值。我会更新我的问题。 – lefloh

+0

让字段不是必须的吗?设置对我来说似乎是一个强制选择我必须承认我没有关于禁用项目的经验,我只是让值提交并处理不良选择服务器端 – Gimby

回答

0

我解决我的问题通过手动设置选择的属性:

<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; 
}