Jsf 2 JSF 2.0-selectOneMenu为空时默认为0

Jsf 2 JSF 2.0-selectOneMenu为空时默认为0,jsf-2,drop-down-menu,java-ee-6,converter,selectonemenu,Jsf 2,Drop Down Menu,Java Ee 6,Converter,Selectonemenu,对于我的项目,我想实现一个带有h:selectOneMenu的组合框。我读了很多关于如何正确处理selectOneMenu和如何实现自定义转换器的文章。组合框应存储来自不同DB表(名为fk_ID)的ID(Long),该DB表具有适当的约束。到目前为止,一切似乎都按计划进行。现在我的问题是: 列fk_ID是可选的,因此组合框中的第一个选项是一个f:selectItem,没有标记为“选择…”的值。当我保存表单并更改值时,一切都正常,除非我将其设置回“选择…”。我得到的错误是约束完整性冲突 我也发现了

对于我的项目,我想实现一个带有h:selectOneMenu的组合框。我读了很多关于如何正确处理selectOneMenu和如何实现自定义转换器的文章。组合框应存储来自不同DB表(名为fk_ID)的ID(Long),该DB表具有适当的约束。到目前为止,一切似乎都按计划进行。现在我的问题是:

列fk_ID是可选的,因此组合框中的第一个选项是一个f:selectItem,没有标记为“选择…”的值。当我保存表单并更改值时,一切都正常,除非我将其设置回“选择…”。我得到的错误是约束完整性冲突

我也发现了问题:转换器按预期返回null,但bean接收长0

XHTML:

<h:selectOneMenu value="#{userBean.selectedModel.fk_id}"
    id="combobox">
    <f:selectItem itemLabel="choose ..." />
    <f:selectItems
        value="#{userBean.items}"
        var="item"
        itemLabel="#{item.value}"
        itemValue="#{item.id}"
    />
    <f:converter converterId="userConverter" />
</h:selectOneMenu>
bean(非常简短的版本):

,但这不是一个我能接受的解决方案


我的问题:为什么转换器返回的值nullsaveModel()方法中是长0

这个转换器是不必要的,没有意义(我希望
UserConverter
User
String
之间转换,而不是在
Long
String
之间转换)。请删除它

现在,您需要告诉JSF将提交的空字符串值解释为
null

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>
这将防止ApacheEL解析器将提交的值强制为原语的默认值,即使您使用的是原语包装器类型作为属性

另见:

与具体问题无关,这里没有组合框。这只是一个简单的下拉列表。组合框是一个可编辑的下拉列表。正确使用术语;)

确实是一个下拉列表;)。问题完全按照你说的解决了。因为我使用的是Tomcat服务器,所以我甚至需要在启动时包含参数。谢谢!
@Named(value = "userBean")
public class UserController implements Serializable {

    @Getter
    @Setter
    private UserModel selectedModel;

    @Getter
    @Setter
    private List<UserModel> items;

    public void saveModel() {
        selectedModel = userService.saveModel(selectedModel);
    }
}
if (selectedModel.getFk_id() == 0)
    selectedModel.setFk_id(null);
<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>
-Dorg.apache.el.parser.COERCE_TO_ZERO=false