2

我将 Jackson 2.2.0 和 Spring 3.2.0 与 Hibernate 4.2.2 一起使用。

我最近不得不通过 POST 向服务器发送一组对象:

{"cancelationDate":"2013-06-05",
 "positions":[
   {"price":"EUR 12.00",
    "count":1},
   {"price":"EUR 99.00",
    "count":1}
 ]
}

我的课程如下所示:

public class Bill extends {
  LocalDate cancelationDate;

  Set<Position> positions;

  ...
}

和:

public class Position { 
  Integer count;

  BigMoney price;

  @JsonIgnore
  Bill bill;

  ...
}

当我打电话bill.getPositions().size()时它告诉我1


如果我使用它List<Position>代替Set<Position>它会很好。那么有什么问题Set呢?

谢谢 :)

等于和哈希码:

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = (int) (prime * result + ((id == null) ? 0 : id.hashCode()));
    return result;
}

public boolean equals(Object obj) {
    if (obj == this)
        return true;
    if (!(obj instanceof Position))
        return false;
    Position equalCheck = (Position) obj;
    if ((id == null && equalCheck.id != null) || (id != null && equalCheck.id == null))
        return false;
    if (id != null && !id.equals(equalCheck.id))
        return false;
    return true;
}   
4

2 回答 2

4

由于 Jackson 反序列化位置的 id 为 null,因此 hashCode 为不同的对象返回相同的值,而 equals 返回 true。Set 不能包含相等的元素。修复你的 equals/hashcode 实现,一切都会正常工作。

建议的新 hashCode/equals:

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = (int) (prime * result + ((id == null) ? 0 : id.hashCode()));
    result = (int) (prime * result + ((price== null) ? 0 : price.hashCode()));
    return result;
}

public boolean equals(Object obj) {
    if (obj == this)
        return true;
    if (!(obj instanceof Position))
        return false;
    Position equalCheck = (Position) obj;
    if ((id == null && equalCheck.id != null) || (id != null && equalCheck.id == null))
        return false;
    if (id != null && !id.equals(equalCheck.id))
        return false;
    if ((price== null && equalCheck.price != null) || (price != null && equalCheck.price == null))
        return false;
    if (price!= null && !price.equals(equalCheck.idprice)
        return false;

    return true;
}   
于 2013-06-04T12:25:18.157 回答
1

Set 在插入行时使用 equals 和 hashcode 方法,您是否覆盖了它们?

我对 jackson 2.2.1 (with Maps) 也有一些错误,你应该升级到 jackson 2.2.2

于 2013-06-04T12:15:53.987 回答