UISelectOne 和 UISelectMany 组件如何在 f:selectItems 中预选默认值

How do UISelectOne and UISelectMany components preselect defaults in f:selectItems

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

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

我认为 converter 对此负责,但当它呈现时它不会进入 getAsObject 方法,仅 getAsString,所以我猜有些不同,但是什么?

谢谢

为此使用 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() to satisfy the 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 麻烦。

另请参阅:

  • How to populate options of h:selectOneMenu from database?