Rest 子类的Spring@RequestBody。@JsonTypeInfo的替代方案?
试图实现这一点Rest 子类的Spring@RequestBody。@JsonTypeInfo的替代方案?,rest,spring-boot,jackson,Rest,Spring Boot,Jackson,试图实现这一点 @RequestMapping public String helloWorld(@RequestBody Parent interface){ // do something with interface } 其中,Parent是一个接口,Child1和Child2是实现 因为这些是第三方库.class文件,我不能使用@JsonTypeInfo 对于这种情况有什么解决方法吗?是的,您可以使用Jackson Mixin为第三方/不可接触类提供Jackson注释 这个
@RequestMapping
public String helloWorld(@RequestBody Parent interface){
// do something with interface
}
其中,Parent
是一个接口,Child1
和Child2
是实现
因为这些是第三方库.class文件,我不能使用@JsonTypeInfo
对于这种情况有什么解决方法吗?是的,您可以使用Jackson Mixin为第三方/不可接触类提供Jackson注释 这个例子相当古老,从这里开始提供,但从上次我实现MixIn时看,它仍然正确 上面的示例5
{ "animals":
[
{"type":"dog","name":"Spike","breed":"mutt",
"leash_color":"red"},
{"type":"cat","name":"Fluffy",
"favorite_toy":"spider ring"}
]
}
import java.io.File;
import java.util.Collection;
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.annotate.JsonSubTypes.Type;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
new CamelCaseNamingStrategy());
mapper.getDeserializationConfig().addMixInAnnotations(
Animal.class, PolymorphicAnimalMixIn.class);
mapper.getSerializationConfig().addMixInAnnotations(
Animal.class, PolymorphicAnimalMixIn.class);
Zoo zoo =
mapper.readValue(new File("input_5.json"), Zoo.class);
System.out.println(mapper.writeValueAsString(zoo));
}
}
class Zoo
{
public Collection<Animal> animals;
}
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = Cat.class, name = "cat"),
@Type(value = Dog.class, name = "dog") })
abstract class PolymorphicAnimalMixIn
{
}
abstract class Animal
{
public String name;
}
class Dog extends Animal
{
public String breed;
public String leashColor;
}
class Cat extends Animal
{
public String favoriteToy;
}
{“动物”:
[
{“类型”:“狗”,“名称”:“穗”,“品种”:“杂种”,
“皮带颜色”:“红色”},
{“type”:“cat”,“name”:“Fluffy”,
“最喜欢的玩具”:“蜘蛛环”}
]
}
导入java.io.File;
导入java.util.Collection;
导入org.codehaus.jackson.annotate.JsonSubTypes;
导入org.codehaus.jackson.annotate.JsonTypeInfo;
导入org.codehaus.jackson.annotate.JsonSubTypes.Type;
导入org.codehaus.jackson.map.ObjectMapper;
公开课Foo
{
公共静态void main(字符串[]args)引发异常
{
ObjectMapper mapper=新的ObjectMapper();
mapper.SetPropertyName策略(
新CamelCaseNamingStrategy());
mapper.getDeserializationConfig().AddMixinNotations(
动物级,多晶型;
mapper.getSerializationConfig().AddMixinNotations(
动物级,多晶型;
动物园
readValue(新文件(“input_5.json”)、Zoo.class);
System.out.println(mapper.writeValueAsString(zoo));
}
}
班级动物园
{
公共集合好的,谢谢你提供了正确的方向。但是,我仍在寻找一种方法,在Spring上下文中使用@RequestBody。@ReuestBody
使用Jackson映射到目标类,具体取决于传入的负载。如果你将ObjectMapper
设置为使用MixIn
,它会起作用。这是正确的方法来完成您的要求。有关如何将传入请求映射到期望的更多信息,请参阅。感谢Darren,我阅读了链接中的说明,但仍然对如何实现这一点感到困惑。它确实提到创建自定义转换器,但我没有看到任何MixIn、ObjectMapper或继承相关的内容。此外,我正在使用Spring boot with没有XML配置,指南建议我需要一个。我比较困惑,你能提供一个代码示例吗?@JunPark这里有一个工作示例,你可以克隆它,我将上面的示例创建到Spring Boot中,有一个ControllerTest,发布一个猫和狗,并将其读入控制器中的动物对象。Thanks Darren,我能够用您提供的说明解决这个问题。但是我看到,当我将MixIn与可实例化超类一起使用时,它优先于子类。有没有办法强制MixIn注释优先?ObjectMapper是最好的(jackson jar).import com.fasterxml.jackson.databind.ObjectMapper;@Autowired private ObjectMapper ObjectMapper;YourClassName yourObjectname=ObjectMapper.readValue(JsonString,YourClassName.class);