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

时间:2015-04-29 12:49:34

标签: jsf jsf-2 primefaces selectonemenu selectmanymenu

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

在我的情况下,我是一个重复的对象,实际上这是两个具有相同值但创建两次的对象,而<p:selectOneMenu>中的所选对象与来自<f:selectItems>的对象不同,而且它是真实的&#39认识它。 我很可能会改变我的设计,它会指向同一个对象,但是如果由于遗留代码等我无法做到这一点,我怎么能改变<p:selectOneMenu>它将比较对象的行为例如id

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

谢谢

1 个答案:

答案 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问题产生影响。

另见: