Validation 著名的验证错误:值无效

Validation 著名的验证错误:值无效,validation,jsf-2,Validation,Jsf 2,我搜索了很多著名的“验证错误:值无效”。我知道这可能和equals方法有关。但是找不到我的有什么问题 xhtml: <h:selectOneMenu id="ayarMenuSA" rendered="#{teklifIslemleriBean.selectedITip == 1}" converter="metalConverter" value="#{teklifIslemleriBean.satisTeklif.metal}"> <f:selectItems

我搜索了很多著名的“验证错误:值无效”。我知道这可能和equals方法有关。但是找不到我的有什么问题

xhtml:

<h:selectOneMenu id="ayarMenuSA" rendered="#{teklifIslemleriBean.selectedITip == 1}" converter="metalConverter" value="#{teklifIslemleriBean.satisTeklif.metal}">
      <f:selectItems value="#{teklifIslemleriBean.ayarMenu}" />
</h:selectOneMenu>
转换器:

@FacesConverter("metalConverter")
public class MetalConverter implements Converter, Serializable {

    private static final long serialVersionUID = -1L;


    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        System.out.println("metalConverter getAsObject("+ str);
        Metal metal = new Metal();
        String values[] = str.split(":");

        if (values.length > 1) {
            metal.setMetalNo(Integer.parseInt(values[0]));
            metal.setAyar(new BigDecimal(values[1]));
            metal.setAgirlik(new BigDecimal(values[2]));//?? intcompact=1500
            metal.setMetalKod(new MetalKod(values[3]));
            metal.setMetalTip(new MetalTip(values[4]));
        }
        return metal;
    }

    Integer getKey(String value) {
        Integer key;
        key = Integer.valueOf(value);
        return key;
    }

    String appendString(Integer value) {
        StringBuilder sb = new StringBuilder();
        sb.append(value);
        return sb.toString();
    }

    @Override
        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {

            if (object == null) {
                return null;
            }
            if (object instanceof Metal) {
                Metal metal = (Metal) object;
                StringBuilder sb = new StringBuilder();
                sb.append(metal.getMetalNo());
                sb.append(':');
                sb.append(metal.getAyar().toString());
                sb.append(':');
                sb.append(metal.getAgirlik().toString());
                sb.append(':');
                sb.append(metal.getMetalKod().getMetalKodu());
                sb.append(':');
                sb.append(metal.getMetalTip().getMetalTipiId());
                System.out.println("metalConverter getAsString(object) -> " + sb.toString());
                return sb.toString();

            } else {
                throw new IllegalArgumentException(object + " nesnesi " + object.getClass().getName() + "tipinde geliyor; olması gereken tip ise: " + Metal.class.getName());
            }
        }
实际上,如果我这样写equals方法:

 @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Metal other = (Metal) obj;
        return true;
    }

它很好用。但是由于某些原因,我不得不使用上面的代码。有人知道这个问题吗?

你不应该用
==
来比较相等的对象=。为此,应使用
Object#equals()
方法<例如,code>Integer
是一个对象,而
int
是一个原语,可以使用
==
安全地进行比较

您需要重写
equals()
方法,如下所示:

private Integer metalNo;
private MetalTip metalTip;
private MetalKod metalKod;
private BigDecimal agirlik;
private BigDecimal ayar;
private boolean durum;

// ...

public boolean equals(Object object) {
    // Basic checks.
    if (object == this) return true;
    if (object == null || getClass() != object.getClass()) return false;

    // Property checks.
    Metal other = (Metal) object;
    if (metalNo == null ? other.metalNo != null : !metalNo.equals(other.metalNo)) return false;
    if (metalTip == null ? other.metalTip != null : !metalTip.equals(other.metalTip)) return false;
    if (metalKod == null ? other.metalKod != null : !metalKod.equals(other.metalKod)) return false;
    if (agirlik == null ? other.agirlik != null : !agirlik.equals(other.agirlik)) return false;
    if (ayar == null ? other.ayar != null : !ayar.equals(other.ayar)) return false;
    if (durum != other.durum) return false;

    // All passed.
    return true;
}
如有必要,您可以随时让IDE自动生成一个


很有趣,因为我使用了Netbeans插入代码选项来生成此方法。我会落实你的答案,并让你知道结果。感谢您的快速响应。仍然存在相同的验证错误。此代码可能还有其他问题,但我找不到。可能是
MetalTip
MetalKod
equals()
已损坏。
 @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Metal other = (Metal) obj;
        return true;
    }
private Integer metalNo;
private MetalTip metalTip;
private MetalKod metalKod;
private BigDecimal agirlik;
private BigDecimal ayar;
private boolean durum;

// ...

public boolean equals(Object object) {
    // Basic checks.
    if (object == this) return true;
    if (object == null || getClass() != object.getClass()) return false;

    // Property checks.
    Metal other = (Metal) object;
    if (metalNo == null ? other.metalNo != null : !metalNo.equals(other.metalNo)) return false;
    if (metalTip == null ? other.metalTip != null : !metalTip.equals(other.metalTip)) return false;
    if (metalKod == null ? other.metalKod != null : !metalKod.equals(other.metalKod)) return false;
    if (agirlik == null ? other.agirlik != null : !agirlik.equals(other.agirlik)) return false;
    if (ayar == null ? other.ayar != null : !ayar.equals(other.ayar)) return false;
    if (durum != other.durum) return false;

    // All passed.
    return true;
}