4

我知道如何预选<p:selectOneMenu>,在 selected 中value应该是来自的对象之一<f:selectItems>,但是这个组件如何在幕后工作,我可以改变这种行为吗?

在我的情况下,我有一个重复的对象,实际上这是两个具有相同值但创建了两次的对象,并且所选对象<p:selectOneMenu>与对象不同<f:selectItems>,它无法识别它。很可能我会改变我的设计,它会指向同一个对象,但如果由于遗留代码等原因我无法做到这一点,我该如何改变<p:selectOneMenu>它将比较对象的行为id

我认为这是converter造成它的原因,但是当它渲染时它不仅仅进入getAsObject方法getAsString,所以我想有一些不同的东西,但是什么?

谢谢

4

1 回答 1

5

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 合约

@Override
public int hashCode() {
    return (id != null) 
        ? (getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

如果由于某些不清楚的原因无法更改现有实体,请将其包装在您自己的 DTO 中。

转换器仅在实体及其唯一String表示之间进行转换,以便在 HTML 输出和 HTTP 请求参数中使用,因此对预选没有影响。它只对潜在的验证错误有影响:值不是有效的麻烦。

也可以看看:

于 2015-04-29T13:29:00.897 回答