Java:使用“将json反序列化为rest模板中的对象”@“类”;在json-SpringBoot中

Java:使用“将json反序列化为rest模板中的对象”@“类”;在json-SpringBoot中,java,jackson,spring-boot,deserialization,resttemplate,Java,Jackson,Spring Boot,Deserialization,Resttemplate,我必须实例化一个类,该类使用@class中的信息从JSON扩展抽象类,如下所示 "name": { "health": "xxx", "animal": { "_class": "com.example.Dog", "height" : "20" "color" : "white" } }, 这里的抽象类是animal,dog扩展了animal类。因此,使用@class中的信息,我们可以直接实例化dog。这也是我在restTemplate中得到的响应 Res

我必须实例化一个类,该类使用@class中的信息从JSON扩展抽象类,如下所示

"name": {
  "health": "xxx",
  "animal": {
    "_class": "com.example.Dog",
    "height" : "20"
    "color" : "white"
  }
},
这里的抽象类是animal,dog扩展了animal类。因此,使用@class中的信息,我们可以直接实例化dog。这也是我在restTemplate中得到的响应

ResponseEntity<List<SomeListName>> response = restTemplate.exchange("http://10.150.15.172:8080/agencies", HttpMethod.GET, request, responseType);
ResponseEntity response=restemplate.exchange(“http://10.150.15.172:8080/agencies,HttpMethod.GET,request,responseType);
执行此行时出现以下错误。 因为POJO类是自动生成的,所以我不能使用像@JsonTypeInfo

我使用的是Spring boot和maven。 控制台中出现此错误

无法读取JSON:无法构造“MyPOJO”的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化程序,或者使用其他类型信息实例化


通过遵循

“混合注释是”:将注释与 类,而不修改(目标)类本身

也就是说,您可以:

定义将使用混合类(或接口)的注释 使用目标类(或接口),使 目标类具有mix-in类具有的所有注释(对于 配置序列化/反序列化的目的)

所以你可以编写你的
AnimalMixIn
类,比如

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "_class")  
@JsonSubTypes({  
    @Type(value = Cat.class, name = "com.example.Cat"),  
    @Type(value = Dog.class, name = "com.example.Dog") })  
abstract class AnimalMixIn  
{  

}  
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
并配置反序列化程序

    ObjectMapper mapper = new ObjectMapper();  
    mapper.getDeserializationConfig().addMixInAnnotations(  
    Animal.class, AnimalMixIn.class);
由于您使用的是Spring Boot,您可以查看下面的博文,了解如何定制ObjectMapper以使用Mixin,特别注意
Jackson2ObjectMapperBuilder的方法

restemplate
中使用定制的
ObjectMapper
应该通过转换器进行设置,例如

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "_class")  
@JsonSubTypes({  
    @Type(value = Cat.class, name = "com.example.Cat"),  
    @Type(value = Dog.class, name = "com.example.Dog") })  
abstract class AnimalMixIn  
{  

}  
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
RestTemplate RestTemplate=new RestTemplate();

List通过遵循

“混合注释是”:将注释与 类,而不修改(目标)类本身

也就是说,您可以:

定义将使用混合类(或接口)的注释 使用目标类(或接口),使 目标类具有mix-in类具有的所有注释(对于 配置序列化/反序列化的目的)

所以你可以编写你的
AnimalMixIn
类,比如

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "_class")  
@JsonSubTypes({  
    @Type(value = Cat.class, name = "com.example.Cat"),  
    @Type(value = Dog.class, name = "com.example.Dog") })  
abstract class AnimalMixIn  
{  

}  
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
并配置反序列化程序

    ObjectMapper mapper = new ObjectMapper();  
    mapper.getDeserializationConfig().addMixInAnnotations(  
    Animal.class, AnimalMixIn.class);
由于您使用的是Spring Boot,您可以查看下面的博文,了解如何定制ObjectMapper以使用Mixin,特别注意
Jackson2ObjectMapperBuilder的方法

restemplate
中使用定制的
ObjectMapper
应该通过转换器进行设置,例如

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "_class")  
@JsonSubTypes({  
    @Type(value = Cat.class, name = "com.example.Cat"),  
    @Type(value = Dog.class, name = "com.example.Dog") })  
abstract class AnimalMixIn  
{  

}  
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
RestTemplate RestTemplate=new RestTemplate();

谢谢你的回答。但是,由于我使用的是spring boot,我是否必须使用任何自定义对象映射器来替换restTemplate中HttpMessageConverter的默认对象映射器。您欢迎,是的,您必须自定义默认对象映射器,我在回答中提供了一些参考。非常感谢您的回答。但是由于我使用的是spring boot,我是否必须使用任何自定义对象映射器来替换restTemplate中HttpMessageConverter的默认对象映射器。您欢迎,是的,您必须自定义默认对象映射器,我在回答中提供了一些参考