JSF转换器验证错误:值无效

JSF转换器验证错误:值无效,jsf,richfaces,Jsf,Richfaces,我有一个rich:pickList,当提交值时,它仍然显示错误:“验证错误:值无效”。我还将断点设置为debug(getAsobject),但在系统调用之后,我什么都没有 BalusC说我将在我的实体中实现equals()方法,或者我在web服务中有实体,我用来自此web服务的数据填充选择列表的右侧 xHTML文件 <h:form> <rich:panel> <h:pan

我有一个rich:pickList,当提交值时,它仍然显示错误:“验证错误:值无效”。我还将断点设置为debug(getAsobject),但在系统调用之后,我什么都没有

BalusC说我将在我的实体中实现equals()方法,或者我在web服务中有实体,我用来自此web服务的数据填充选择列表的右侧

xHTML文件

            <h:form>
                <rich:panel>
                    <h:panelGrid columns="2" styleClass="criteresSaisie"
                        rowClasses="critereLigne" columnClasses="titreColonne,">

                        <h:outputLabel for="libelleComplement" value="           "
                            size="20" />
                        <rich:pickList id="libelleComplement" sourceCaption="Compléments"
                            targetCaption="Compléments sélectionnés"
                            value="#{listeCmpltDispoModel.listeCmpltSelect}" size="15"
                            addText="&gt;" addAllText="&gt;&gt;" removeText="&lt;"
                            removeAllText="&lt;&lt;" listWidth="270px" listHeight="110px"
                            orderable="true">
                            <f:selectItems value="#{listeCmpltDispoModel.listeCmpltDispo}"
                                var="liste" itemLabel="#{liste.libelleComplement}"
                                itemValue="#{liste}" />
                            <f:converter converterId="cmpltsTitresConcerter" />
                        </rich:pickList>
                    </h:panelGrid>

                    <h:panelGroup>
                        <div align="right">
                            <h:panelGrid columns="8">
                                <h:commandButton value="Valider"
                                    action="#{saisieCmpltsTitreCtrl.valider}" />
                            </h:panelGrid>
                        </div>
                    </h:panelGroup>

                </rich:panel>
            </h:form>
模型

@ManagedBean(name=“listcmpldispomodel”)
@会议范围
公共类ListCmplTDisPoModel实现可序列化{
私有静态最终长serialVersionUID=1L;
私人长期债务;
私人字符串诽谤;
私人公司;
私有列表列表CMPLTDISPO;
私有列表listcmpltselect;
公共列表CmplTdispoModel(){
}
公共长getCodeComplement(){
返回cdComplement;
}
public void setCodeComplement(长cdComplement){
this.cdComplement=cdComplement;
}
公共字符串getlibelle1(){
反诽谤;
}
公共void setLibelleComplement1(字符串libellecomplement){
this.libelleComplement=libelleComplement;
}
公共长getCcomplement(){
返回cdComplement;
}
public void setCdComplement(长cdComplement){
this.cdComplement=cdComplement;
}
公共字符串getlibelleComplete(){
反诽谤;
}
public void setlibelleComplete(字符串libelleComplete){
this.libelleComplete=libelleComplete;
}
公共列表GetListCmplTdispo(){
返回列表cmpltdispo;
}
公共无效设置ListCmplTDispo(列表ListCmplTDispo){
this.listcmpltdispo=listcmpltdispo;
}
public int getNbCompl(){
返回nbCompl;
}
公共无效设置nbCompl(int nbCompl){
this.nbCompl=nbCompl;
}
公共列表GetListCmplTselect(){
返回listcmpltselect;
}
public void setListCmplTselect(列表ListCmplTselect){
this.listcmpltselect=listcmpltselect;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果
+((cdComplement==null)?0:cdComplement.hashCode());
结果=素数
*结果
+((libelleComplete==null)?0:libelleComplete
.hashCode());
结果=素数*结果
+((ListCmplTDispo==null)?0:ListCmplTDispo.hashCode());
结果=素数
*结果
+((ListCmplTselect==null)?0:ListCmplTselect.hashCode());
结果=素数*结果+nbCompl;
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(!(对象实例的补码disposortedto)){
返回false;
}
return((complementsDisposortedTo)obj).getCcomplement()==this.Ccomplement;
}
}

我知道哪种可能是解决方案。 您应该将列表和所选元素存储在属性中,并在使用组件时在范围内维护它们

实体的
equals()
方法不正确。它不仅在错误的类(支持bean类而不是模型类)中,而且还在
对象上使用
=
(对象上的
=
只测试引用,而不是内部值;作为初学者,您应该已经在
字符串上经历了这个错误)

Long
上的
=
只会返回
true
,因为
Long
实例是由
Long#valueOf()
Long#parseLong()
创建的,值介于-128和127之间。任何其他内容,包括
new Long(value)
和那些值超出给定“flyweight”范围的内容,都返回
false

与其他所有Java对象(如当前对象)一样,您需要使用
equals()
。将其放在正确的类中,并按如下方式实现:

public class ComplementsDispoSortieDTO {
    
    private Long cdComplement;

    // ...

    @Override
    public boolean equals(Object obj){
        if (!(obj instanceof ComplementsDispoSortieDTO)){
            return false;
        }

        return (cdComplement != null) 
             ? cdComplement.equals(((ComplementsDispoSortieDTO) obj).cdComplement) 
             : (obj == this); 
    }

}
注意,我还添加了缺少的反身
obj==this
。有关要求列表,请参见

另见:

您已经自己给出了答案。到底是什么问题?如果您已经知道这是可能的原因之一,为什么不显示
equals()如果我没有访问该实体?如果你没有访问该实体的权限,你到底是如何实现它的?我把它放在模型中(我编辑了它),是这样的吗?我调用web服务获取dataOP已经为此使用了
@SessionScoped
。这绝对不是问题的原因。信不信由你,在类似的情况下,我删除了equals和hashcode,它成功了。然后我决定使用DTO而不是真实对象来维护实体hashcode和equals。但我的dto只有所需的属性+可序列化实现。如果您的
equals()
实现被严重破坏,并且您在应用程序范围中存储对可用项的引用,而从未从数据库重新加载它们,则可能会发生这种情况。一旦您开始从DB重新加载它们,那么您的方法就失效了。
@ManagedBean(name = "listeCmpltDispoModel")
@SessionScoped
public class ListeCmpltDispoModel implements Serializable {
private static final long serialVersionUID = 1L;

private Long cdComplement;
private String libelleComplement;
private int nbCompl;

private List<ComplementsDispoSortieDTO> listeCmpltDispo ;
private List<ComplementsDispoSortieDTO> listeCmpltSelect ;

public ListeCmpltDispoModel() {
}

public Long getCodeComplement() {
    return cdComplement;
}

public void setCodeComplement(Long cdComplement) {
    this.cdComplement = cdComplement;
}

public String getLibelleComplement1() {
    return libelleComplement;
}

public void setLibelleComplement1(String libelleCoplement) {
    this.libelleComplement = libelleCoplement;
}

public Long getCdComplement() {
    return cdComplement;
}

public void setCdComplement(Long cdComplement) {
    this.cdComplement = cdComplement;
}


public String getLibelleComplement() {
    return libelleComplement;
}

public void setLibelleComplement(String libelleComplement) {
    this.libelleComplement = libelleComplement;
}

public List<ComplementsDispoSortieDTO> getListeCmpltDispo() {
    return listeCmpltDispo;
}

public void setListeCmpltDispo(List<ComplementsDispoSortieDTO> listeCmpltDispo) {
    this.listeCmpltDispo = listeCmpltDispo;
}

public int getNbCompl() {
    return nbCompl;
}

public void setNbCompl(int nbCompl) {
    this.nbCompl = nbCompl;
}

public List<ComplementsDispoSortieDTO> getListeCmpltSelect() {
    return listeCmpltSelect;
}

public void setListeCmpltSelect(List<ComplementsDispoSortieDTO> listeCmpltSelect) {
    this.listeCmpltSelect = listeCmpltSelect;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((cdComplement == null) ? 0 : cdComplement.hashCode());
    result = prime
            * result
            + ((libelleComplement == null) ? 0 : libelleComplement
                    .hashCode());
    result = prime * result
            + ((listeCmpltDispo == null) ? 0 : listeCmpltDispo.hashCode());
    result = prime
            * result
            + ((listeCmpltSelect == null) ? 0 : listeCmpltSelect.hashCode());
    result = prime * result + nbCompl;
    return result;
}

@Override
public boolean equals(Object obj){
    if(!(obj instanceof ComplementsDispoSortieDTO)){
        return false;
    }
    return ((ComplementsDispoSortieDTO)obj).getCdComplement()==this.cdComplement;
}
}
public class ComplementsDispoSortieDTO {
    
    private Long cdComplement;

    // ...

    @Override
    public boolean equals(Object obj){
        if (!(obj instanceof ComplementsDispoSortieDTO)){
            return false;
        }

        return (cdComplement != null) 
             ? cdComplement.equals(((ComplementsDispoSortieDTO) obj).cdComplement) 
             : (obj == this); 
    }

}