Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 带有POJO和转换器的selectOneMenu的选项选择错误_Jsf 2_Primefaces_Mojarra - Fatal编程技术网

Jsf 2 带有POJO和转换器的selectOneMenu的选项选择错误

Jsf 2 带有POJO和转换器的selectOneMenu的选项选择错误,jsf-2,primefaces,mojarra,Jsf 2,Primefaces,Mojarra,在我们公司,我们遇到了一个严重的问题,我们认为这是JSF规范的一个严重设计缺陷,如果这是正常行为的话 这是我们的用例: SelectOneMenu标准JSF或primefaces,无所谓,相同的行为 选择值为数据库实体、标签为字符串的项 SelectOne菜单上的一个通过属性的转换器,该属性将实体转换为其ID getAsString,并将该ID转换为实体getAsObject 只要使用与selectItems中的实体相同的entityManager加载selectOneMenu的value属性中

在我们公司,我们遇到了一个严重的问题,我们认为这是JSF规范的一个严重设计缺陷,如果这是正常行为的话

这是我们的用例:

SelectOneMenu标准JSF或primefaces,无所谓,相同的行为 选择值为数据库实体、标签为字符串的项 SelectOne菜单上的一个通过属性的转换器,该属性将实体转换为其ID getAsString,并将该ID转换为实体getAsObject 只要使用与selectItems中的实体相同的entityManager加载selectOneMenu的value属性中的实体,一切都会正常工作。我们有相同的POJO,因此相同的HashCodeObjectEquals返回true。但是,一旦其中一个实体通过不同的entityManager加载,因此具有不同的哈希代码,我们就永远无法获得匹配项来生成选定项HTML的预期选定属性

这种行为的原因是,JSF impl和primefaces都在调用中使用POJO

boolean selected = isSelected(context, menu, itemValue, valuesArray, converter);
对于itemValue和valuesArray。isSelected的实现依赖于POJO的Objectequals。在我看来,如果我们有一个转换器并将其传递给isSelected,它应该始终使用ConvertergetAsString的值。这也是POST请求的行为。这里我们得到了selectOneMenu的submittedValue,它与POJO ConvertergetAsString的转换值相比较

现在的问题是:
这是规范中描述的预期行为吗?转换器的输出不是处理这种比较的更好方法吗?现在,我们必须修改实体类并覆盖equals方法才能使用此构造。

您的错误是忘记实现/autogenerate equals和hashCode方法符合契约。这超出了JSF的控制范围。指责JSF毫无意义

有一个基本实体是很方便的,您的所有实体都从该实体扩展而来,这样您就不需要在所有实体上重复该任务,即使普通的IDE/工具可以轻松地自动生成它们。您可以在第2页中找到一个详细的示例,请参见链接

另见:
我相信这是正确的行为。在Java端,组件和选择的值是POJO。您可以完全控制它们的相等逻辑等。它不应该被转换为UI显示和返回。作为组件用户,您不应该费心去了解POJO是如何显示的。如文本、图标、颜色等。组件的Java端与POJO不兼容并通信

   YOUR CODE ----------> JAVA COMPONENT --------> CONVERTER ----------> HTML

此外,我猜想依赖实体的引用相等是一条解决问题的道路。将equals/hashCode设置为使用实际ID是最好的方法。

谢谢。我仍然相信,在这两种情况下使用转换器是更好的方法,因为它更加一致。我们已经实现了覆盖作为这个问题的解决方案,但我对这种行为并不满意。如果没有覆盖,你也会在其他地方遇到麻烦,这些被用作JavaBean,比如被收集在一个集合中。我目前正在测试你的方法并实现equals/hashCode,但现在我们有了一个新问题。当调用其中一个方法而未加载外部实体时,我们遇到了延迟初始化异常。有什么建议吗?我们正在使用hibernate 4.1.6.Final作为JPA提供程序。@grubi:对于实体,您最好按类+主键进行比较,而不是按所有字段进行比较。有关具体示例,请参见上一个链接。@grubi:我从未见过这个问题。您最好针对Hibernate/JPA人员提出一个新问题。