2013-06-22 42 views
14

Hãy nói rằng tôi có một lớp miền:Xuân @RequestBody chứa một danh sách các loại khác nhau (nhưng cùng một giao diện)

public class Zoo{ 
     private List<Animal> animals; 
     .... 

nơi một động vật là một giao diện với hiện thực khác nhau (Cát, Dog). Hãy nói rằng tôi muốn để có thể tiết kiệm một đối tượng Zoo:

@RequestMapping(value = "/zoo", method = RequestMethod.POST) 
    public @ResponseBody void save(@RequestBody Zoo zoo) { 
    .... 

và tôi muốn gửi một json - một cái gì đó như:

{ 
     animals:[ 
      {type:'Cat', whiskers-length:'3'}, 
      {type:'Dog', name:'Fancy'} 
     ] 
    } 

Làm thế nào tôi có thể nói mùa xuân MVC để lập bản đồ vật để Cát gõ khi gõ == 'Mèo' và ánh xạ nó vào một lớp Dog khi gõ == 'Chó'?

+0

Xin lỗi vì sự nhầm lẫn với json không hợp lệ. Nhưng nó vẫn không giải quyết được vấn đề của tôi, đó là ánh xạ từ đối tượng json {type: 'Cat', whiskersLength: '3'} đến lớp Cat. Lớp Zoo chỉ biết rằng danh sách động vật chứa động vật. Nhưng làm thế nào để các deserializer json biết được việc thực hiện giao diện động vật (Dog hoặc Cat) để sử dụng cho đối tượng json cụ thể? –

Trả lời

15

Bạn nên sử dụng chú thích Jackson @JsonTypeInfo@JsonSubTypes để đạt được json đa hình. Các chú thích nằm trên lớp cơ sở Animal.

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "Dog"), 
     @JsonSubTypes.Type(value = Cat.class, name = "Cat")}) 
public abstract class Animal { 

} 
+0

Công trình này hoạt động! Cảm ơn nhiều! –

+3

Điều này có vẻ tuyệt vời cho 2 loại phụ (Mèo và Chó), nhưng nếu bạn có một danh sách lớn các kiểu phụ? Có nhiều loại động vật trong một sở thú :) – Wouter

+1

có cách nào để đặt một số chú thích trên Mèo hoặc Chó, mà không đặt '@ JsonSubTypes' lên động vật không? – dmitryvim

3

Có một chú thích đơn giản ra ngay bây giờ:

@JsonRootName("dog") 
public class Dog extends Animal {...} 

Các tham chiếu đến các chú thích có thể được tìm thấy trên fasterxml.github

Các vấn đề liên quan