Hãy nói rằng tôi có client-side JSON này đầu vào:Deserialization của mảng hoạt Javascript để Java LinkedHashSet sử dụng Jackson và mùa xuân không loại bỏ bản sao
{
id: "5",
types: [
{id: "1", types:[]},
{id: "2", types:[]},
{id: "1", types[]}
]
}
Tôi có lớp này:
class Entity {
private String id;
private Set<Entity> types = new LinkedHashSet<>();
public String getId() {
return this.id;
}
public String setId(String id) {
this.id = id;
}
public Set<Entity> getTypes() {
return types;
}
@JsonDeserialize(as=LinkedHashSet.class)
public void setTypes(Set<Entity> types) {
this.types = types;
}
@Override
public boolean equals(Object o){
if (o == null || !(o instanceof Entity)){
return false;
}
return this.getId().equals(((Entity)o).getId());
}
}
tôi có điểm cuối Java Spring này, nơi tôi chuyển đầu vào trong phần nội dung của một yêu cầu POST:
@RequestMapping(value = "api/entity", method = RequestMethod.POST)
public Entity createEntity(@RequestBody final Entity in) {
Set<Entity> types = in.getTypes();
[...]
}
Tôi muốn ở:
Set<Entity> types = in.getTypes();
chỉ có hai mục theo đúng thứ tự ... kể từ khi một trong số họ là một bản sao dựa trên id ... Thay vào đó tôi nhận được bản sao trong LinkedHashSet (!)
Tôi nghĩ từ mã mà tôi có mà loại bỏ các bản sao sẽ làm việc tự động, nhưng dường như nó không phải là.
Câu hỏi này có ngữ cảnh rộng hơn Why do I need to override the equals and hashCode methods in Java? vì nó đang sử dụng tuần tự hóa Jackson ngầm qua Java Spring.
Hàm băm() của bạn ở đâu? – GurV
Đó là một phần của hợp đồng giống như 'bằng (đối tượng)'. – GurV
Cảm ơn! có vẻ như tôi đang thiếu điều đó - hãy để tôi thêm nó và xem nó hoạt động như thế nào –