我知道如何预选<p:selectOneMenu>
,在选定的value
中应该是来自<f:selectItems>
的对象之一,但该组件如何在幕后工作?我可以更改此行为吗?
在我的情况下,我是一个重复的对象,实际上这是两个具有相同值但创建两次的对象,而<p:selectOneMenu>
中的所选对象与来自<f:selectItems>
的对象不同,而且它是真实的&#39认识它。
我很可能会改变我的设计,它会指向同一个对象,但是如果由于遗留代码等我无法做到这一点,我怎么能改变<p:selectOneMenu>
它将比较对象的行为例如id
?
我认为converter
对此负责,但是当它呈现时它不会仅getAsObject
方法进入getAsString
,所以我猜那里&# 39;有些不同,但是什么?
谢谢
答案 0 :(得分:3)
它使用Object#equals()
。您可以通过在您的实体上相应地实现它来更改(修复)此行为。
private Long id;
@Override
public boolean equals(Object other) {
return (other != null && getClass() == other.getClass() && id != null)
? id.equals(getClass().cast(other).id)
: (other == this);
}
请勿忘记hashCode()
以满足equals-hashCode contract。
@Override
public int hashCode() {
return (id != null)
? (getClass().hashCode() + id.hashCode())
: super.hashCode();
}
如果由于某些不明原因而无法更改现有实体,请将其包装在您自己的DTO中。
转换器仅在实体及其唯一String
表示之间进行转换,以便在HTML输出和HTTP请求参数中使用,因此对预选没有影响。它只会对潜在的Validation Error: Value is not valid问题产生影响。