Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 子类的Spring@RequestBody。@JsonTypeInfo的替代方案?_Rest_Spring Boot_Jackson - Fatal编程技术网

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);