2013-08-23 25 views
10

Tôi đang sử dụng Jackson 1.9.x. Giống như ví dụ vật, đây là những gì tôi muốn làm:Đa hình Jackson: Cách ánh xạ nhiều loại phụ đến cùng một lớp

Hãy nói rằng tôi có một lớp Thú:

public class Animal { 
    private String type; 
    // accessors 
} 

public class Mammal extends Animal { 
    private String diet; 
    // accessors 
} 

public class Bird extends Animal { 
    private boolean tropical; 
    // accessors 
} 

Tôi muốn để có thể làm điều gì đó như thế này (nơi tôi bản đồ một vài phân nhóm để một lớp, và một vài chi tiết về một lớp khác nhau):

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

} 

gì tôi nhìn thấy ngay bây giờ là Jackson sẽ chỉ nhận ra Dog-to-động vật có vú và Dodo-to-Bird ánh xạ. Điều này là do StdSubtypeResolver._collectAndResolve() chỉ cho phép cùng một lớp được đăng ký một lần (do việc thực hiện NamedType.equals()).

Có cách giải quyết nào cho vấn đề tôi thấy không?

+0

[This] (http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html) có vẻ liên quan ... – jahroy

+0

Tôi đang đánh dấu câu trả lời của StaxMan là câu trả lời được chấp nhận, nhưng thực tế là ý tưởng mà anh ta đã thảo luận trong phần tiếp theo mà tôi đang lên kế hoạch thực hiện. Bây giờ tôi không có kế hoạch để nộp một RFE để theo dõi vấn đề jackson-databind. –

Trả lời

3

Có thể không phải bằng cách sử dụng chú thích. Các vấn đề xuất phát từ thực tế là việc lập bản đồ như vậy sẽ không hoạt động cho tuần tự hóa, và ánh xạ hiện tại sẽ mong đợi mối quan hệ một (một). Nhưng bạn có thể muốn gửi RFE theo số jackson-databind issue tracker; thêm hỗ trợ có thể là có thể.

+0

Cảm ơn StaxMan. Tôi có đúng khi cho rằng bạn là tác giả chính của Jackson? Một điều mà tôi nghĩ đến nhưng chưa thực sự khám phá là sử dụng Deserializer + TypeDeserializer tùy chỉnh. Điều này sẽ giúp tôi? Những loại vấn đề bạn mong đợi tôi muốn chạy vào? –

+0

Đúng, tôi là tác giả chính. Và có, tùy chỉnh loại (de) serializer là những gì bạn thực sự cần (hoặc đúng hơn, ràng buộc đến/từ id loại); serializer mặc định/deserializer hoàn toàn nên làm việc với không có sửa đổi. Loại xử lý id là mô-đun theo thiết kế, để hỗ trợ các phương thức bao gồm khác nhau, v.v. – StaxMan

+1

Chỉ cần tạo một vấn đề liên quan đến điều này khi tôi đang chạy trong cùng một vấn đề – TheBakker

2

Tôi cũng phải đối mặt với cùng một vấn đề và phát hiện ra rằng ánh xạ Subtype mong đợi các lớp duy nhất.

Điều tôi đã làm là tạo hai lớp mở rộng cùng một lớp cơ sở. Các lớp mở rộng trống vì chúng có các thuộc tính giống như lớp cơ sở. Sau đó, thêm chúng vào bản đồ Subtype. Ví dụ, trong trường hợp của bạn, nó sẽ được -

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

} 

public class BirdCockatoo extends Cockatoo{} 
public class BirdDodo extends Dodo{} 

tôi được biết là không phải là phương pháp tốt nhất nhưng đến khi vấn đề không được giải quyết, nó có thể là cách tốt nhất để sửa lỗi này. Tôi đã làm theo cách này.

Hy vọng nó sẽ giúp bạn!

3

Lỗi đã được giải quyết trong phiên bản 2.6.0, vì vậy bạn chỉ cần cập nhật Jackson lên phiên bản 2.6.0 trở lên. Thông tin bổ sung là herehere.

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