Code: Select all
package org.example;
public class Container {
private Base base;
public void setBase(Base newBase) {
base = newBase;
}
public String getName() {
return base.getName();
}
}
=========
package org.example;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
@JsonTypeInfo(defaultImpl = Sub1.class, use = Id.NONE)
public abstract class Base {
public abstract String getName();
}
=========
package org.example;
public class Sub1 extends Base {
private String name;
@Override
public String getName() {
return name;
}
}
=============
package org.example;
public class Sub2 extends Base {
private String title;
public Sub2(String newTitle) {
title = newTitle;
}
@Override
public String getName() {
return title;
}
}
Der folgende Code schlägt jedoch beim zweiten Aufruf von objectMapper.readValue()
fehl
Code: Select all
package org.example;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws JsonProcessingException {
Container container = new Container();
container.setBase(new Sub2("bb"));
System.out.println(container.getName());
ObjectMapper objectMapper = new ObjectMapper();
Sub1 sub1 = objectMapper.readValue("""
{"name":"cc"}
""", Sub1.class);
container.setBase(sub1);
System.out.println(container.getName());
container = objectMapper.readValue(
"""
{
"base":{
"name":"aa"
}
}
""", Container.class);
}
}
Instanz von org.example.Base kann nicht erstellt werden
und ich verstehe nicht, warum die Annotation @JsonTypeInfo nicht ausreicht, um Jackson anzuweisen, Sub1 zu instanziieren.
 Mobile version
 Mobile version