Tôi đang sử dụng Jackson để loại đa hình không đồng nhất từ JSON. Tôi đang sử dụng các chú thích @JsonTypeInfo
, @JsonSubTypes
và @JsonTypeName
tương tự như Ví dụ 4 trong this post. Câu hỏi của tôi là, bây giờ tôi cần một người khác để mở rộng mã của tôi và thêm một lớp thứ ba: public class Duck extends Animal
bên ngoài cơ sở mã ban đầu. Làm thế nào tôi có thể (hoặc những người khác) thêm thông tin SubType mà không sửa đổi mã nguồn (chú thích) của public abstract Animal class
?Thêm thông tin SubType vào thời gian chạy sử dụng Jackson cho đa hình
CẬP NHẬT:
Tôi buộc phải sử dụng @JsonTypeName để giải quyết các thay đổi phiên bản POJO. Ví dụ:
package my.zoo;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = Cat.class, name = "[email protected]"),
@Type(value = Dog.class, name = "[email protected]"),
@Type(value = Catv2.class, name = "[email protected]")})
public abstract class Animal {
...
}
@JsonTypeName("[email protected]")
public class Cat extends Animal {
...
}
@JsonTypeName("[email protected]")
public class Catv2 extends Animal {
...
}
@JsonTypeName("[email protected]")
public class Dog extends Animal {
...
}
// in another java package/project
package another.zoo;
import my.zoo.*;
@JsonTypeName("[email protected]")
public class Dogv2 extends Animal {
...
}
Bây giờ vấn đề tôi phải đối mặt là tôi không thể unmarshal một JSON có gõ tên "[email protected]" mà không cần thêm @Type(value = another.zoo.Dogv2.class, name = "[email protected]")})
đến lớp Animal
. Vì vậy, làm điều này với chú thích rõ ràng là không thể. Có cách nào để làm điều này trong thời gian chạy không?
UPDATE 2:
Tôi chỉ tìm thấy this SO question với trường hợp sử dụng tương tự như/giống nhau. Mối quan tâm của tôi ở đây là việc sử dụng chú thích sẽ ngăn mọi người mở rộng/triển khai lớp/giao diện cơ sở của bạn. Tôi muốn một cách để duy trì khả năng mở rộng của lớp cơ sở/giao diện của tôi và đảm bảo rằng logic của tôi (un) marshalling sẽ làm việc với các loại bê tông trong tương lai.
Bạn đã làm gì với chú thích @JsonTypeInfo? Bạn đã sử dụng JsonTypeInfo.Id.NAME chưa? – ampofila
@ampofila, mã mô hình được hiển thị trong mã mẫu. Các. Các cuộc gọi RegisterSubtypes() được thực hiện trong trình điều khiển ứng dụng trong quá trình khởi động. Jackson sẽ chăm sóc mọi thứ khi deserializing json. – derrdji
Cảm ơn bạn đã trả lời nhanh chóng.Tuy nhiên tôi không chắc chắn làm thế nào để đánh chặn một dịch vụ REST (tôi có một bộ điều khiển mà mất như param giao diện và tự động unmarhsalls json gửi đến). Cách của bạn hoạt động khi tôi đọc một cái gì đó từ một tập tin nhưng nó không phù hợp với một yêu cầu POST bằng cách sử dụng REST. – ampofila