【问题标题】:Famous Validation Error: Value is not valid [duplicate]著名的验证错误:值无效[重复]
【发布时间】:2012-03-06 22:49:21
【问题描述】:

我经常搜索这个著名的“验证错误:值无效”。我知道这可能与equals方法有关。但是找不到我的问题。

xhtml:

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

支持 bean:

List<Metal> metalList = teklifIslemServisi.metalKodunaGoreMetalGetir(null, selectedMK);           
ayarMenu.clear();
for (Metal m : metalList) {
    ayarMenu.add(new SelectItem(m, "Stok No:" + m.getMetalNo() + " ,Ayar: " + m.getAyar() + " ,Ağırlık: " + m.getAgirlik() + " ,MetalKod: " + m.getMetalKod().getMetalKodu()));
}

pojo:

public class Metal implements java.io.Serializable {

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

    public Metal() {
    }

    public Metal(boolean durum) {
        this.durum = durum;
    }

    public Metal(MetalTip metalTip, MetalKod metalKod, BigDecimal agirlik, BigDecimal ayar, boolean durum) {
        this.metalTip = metalTip;
        this.metalKod = metalKod;
        this.agirlik = agirlik;
        this.ayar = ayar;
        this.durum = durum;
    }


    public Integer getMetalNo() {
        return this.metalNo;
    }

    public void setMetalNo(Integer metalNo) {
        this.metalNo = metalNo;
    }

    public MetalTip getMetalTip() {
        return this.metalTip;
    }

    public void setMetalTip(MetalTip metalTip) {
        this.metalTip = metalTip;
    }

    public MetalKod getMetalKod() {
        return this.metalKod;
    }

    public void setMetalKod(MetalKod metalKod) {
        this.metalKod = metalKod;
    }

    public BigDecimal getAgirlik() {
        return this.agirlik;
    }

    public void setAgirlik(BigDecimal agirlik) {
        this.agirlik = agirlik;
    }

    public BigDecimal getAyar() {
        return this.ayar;
    }

    public void setAyar(BigDecimal ayar) {
        this.ayar = ayar;
    }

    public boolean isDurum() {
        return this.durum;
    }

    public void setDurum(boolean durum) {
        this.durum = durum;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Metal other = (Metal) obj;
        if (this.metalNo != other.metalNo && (this.metalNo == null || !this.metalNo.equals(other.metalNo))) {
            return false;
        }
        if (this.metalTip.getMetalTipiId() != other.metalTip.getMetalTipiId() && (this.metalTip == null || this.metalTip.getMetalTipiId() != (other.metalTip.getMetalTipiId()))) {
            return false;
        }
        if (!this.metalKod.getMetalKodu().equals(other.metalKod.getMetalKodu()) && (this.metalKod == null || !this.metalKod.getMetalKodu().equals(other.metalKod.getMetalKodu()))) {
            return false;
        }
        if (this.agirlik != other.agirlik && (this.agirlik == null || !this.agirlik.equals(other.agirlik))) {
            return false;
        }
        if (this.ayar != other.ayar && (this.ayar == null || !this.ayar.equals(other.ayar))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 17 * hash + (this.metalNo != null ? this.metalNo.hashCode() : 0);
        hash = 17 * hash + (this.metalTip != null ? this.metalTip.hashCode() : 0);
        hash = 17 * hash + (this.metalKod != null ? this.metalKod.hashCode() : 0);
        hash = 17 * hash + (this.agirlik != null ? this.agirlik.hashCode() : 0);
        hash = 17 * hash + (this.ayar != null ? this.ayar.hashCode() : 0);
        return hash;
    }



}

转换器:

@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;
    }

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

【问题讨论】:

    标签: validation jsf-2


    【解决方案1】:

    您不应使用== 或!= 比较对象 是否相等。您应该为此使用Object#equals() 方法。例如,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() 坏了。
    猜你喜欢
    • 2011-10-29
    • 2013-01-06
    • 2011-09-13
    • 2012-05-13
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2011-06-01
    相关资源
    最近更新 更多