के साथ एक पॉलिमॉर्फिक क्लास को क्रमबद्ध करते समय अपवाद, मैं वर्तमान में जैक्सन 1.x से जैक्सन 2.5 जेसन मैपर तक कुछ कोड माइग्रेट कर रहा हूं और एक समस्या आई है जो 1.x में नहीं थी।जेएसओएन जैक्सन - कस्टम सीरिएलाइज़र
इस सेटअप है (नीचे दिए गए कोड देखें):
- इंटरफ़ेस IPET
- वर्ग कुत्ते को लागू करता है IPET
- IPET @JsonTypeInfo और @JsonSubTypes साथ टिप्पणी की जाती है
- वर्ग मानव की संपत्ति है @JsonSerialize (= customPetSerializer.class का उपयोग करके) टाइप किया गया आईपेट टाइप करें
समस्या: यदि मैं कुत्ते के एक उदाहरण को क्रमबद्ध करता हूं तो यह अपेक्षित काम करता है (जैक्सन द्वारा जेसन स्ट्रिंग में टाइप जानकारी भी जोड़ दी जाती है)। हालांकि जब मैं मानव वर्ग का एक उदाहरण को क्रमानुसार एक अपवाद कह फेंक दिया जाता है:
com.fasterxml.jackson.databind.JsonMappingException: प्रकार आईडी निपटने प्रकार com.pet.Dog के लिए लागू नहीं किया (संदर्भ श्रृंखला के माध्यम से : com.Human [ "पालतू"])
CustomPetSerializer वर्ग (एक ब्रेकप्वाइंट का उपयोग कर परीक्षण किया यह लागू नहीं है serialize (...) विधि)।
कोड:
IPET कार्यान्वयन:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value=Dog.class, name="dog")
//,@JsonSubTypes.Type(value=Cat.class, name="cat")
//more subtypes here...
})
public interface IPet
{
public Long getId();
public String getPetMakes();
}
कुत्ता कार्यान्वयन:
public class Dog implements IPet
{
@Override
public String getPetMakes()
{
return "Wuff!";
}
@Override
public Long getId()
{
return 777L;
}
}
मानव जो एक कुत्ते का मालिक:
public class Human
{
private IPet pet = new Dog();
@JsonSerialize(using=CustomPetSerializer.class)
public IPet getPet()
{
return pet;
}
}
CustomPetSerializer कार्यान्वयन:
public class CustomPetSerializer extends JsonSerializer<IPet>
{
@Override
public void serialize(IPet value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException
{
if(value != null && value.getId() != null)
{
Map<String,Object> style = new HashMap<String,Object>();
style.put("age", "7");
gen.writeObject(style);
}
}
}
JUnit परीक्षण विधि:
@Test
public void testPet() throws JsonProcessingException
{
ObjectMapper mapper = new ObjectMapper();
Human human = new Human();
//works as expcected
String json = mapper.writeValueAsString(human.getPet());
Assert.assertNotNull(json);
Assert.assertTrue(json.equals("{\"type\":\"dog\",\"id\":777,\"petMakes\":\"Wuff!\"}"));
//throws exception: Type id handling not implemented for type com.pet.Dog (through reference chain: com.Human["pet"])
json = mapper.writeValueAsString(human); //exception is thrown here
Assert.assertNotNull(json);
Assert.assertTrue(json.contains("\"age\":\"7\""));
}
डिंग, डिंग, डिंग ... यह सही है! आपका बहुत बहुत धन्यवाद! –