【发布时间】:2013-12-06 11:47:15
【问题描述】:
在我们公司,我们遇到了一个严重的问题,如果这是正常行为,我们认为这是 JSF 规范的严重设计缺陷。
这是我们的用例:
- SelectOneMenu(标准 JSF 或 primefaces,无所谓,行为相同)
- SelectItems 以数据库实体为值,以字符串为标签
- 转换器(通过 selectOneMenu 上的属性)将实体转换为其 ID (getAsString) 并将 ID 转换为实体 (getAsObject)
只要 selectOneMenu 的 value 属性内的实体使用与 selectItems 内的实体相同的 entityManager 加载,一切都会按预期工作。我们有相同的 POJO,因此也有相同的哈希码(Object#equals() 返回 true)。但是一旦其中一个实体通过不同的 entityManager 加载并因此具有不同的哈希码,我们就永远无法获得匹配以生成选择项的预期 selected 属性(HTML )。
这种行为的原因是,JSF-impl 和 primefaces 都在调用中使用 POJO
boolean selected = isSelected(context, menu, itemValue, valuesArray, converter);
对于 itemValue 和 valuesArray。 isSelected 的实现依赖于 POJO 的 Object#equals()。在我看来,如果我们有一个 Converter 并将它传递给 isSelected,它应该始终使用 Converter#getAsString 的值。这也是 POST 请求的行为。在这里,我们得到了 selectOneMenu 的提交值,它与 POJO 的转换值(Converter#getAsString)进行了比较。
现在的问题: 这是规范中描述的预期行为吗?转换器的输出不是处理这种比较的更好方法吗?现在我们必须修改实体类并覆盖 equals 方法才能使用此构造。
【问题讨论】:
标签: jsf-2 primefaces mojarra