我必须实例化一个类,该类使用@class中的信息从JSON扩展了抽象类,如下所示。
"name": { "health": "xxx", "animal": { "_class": "com.example.Dog", "height" : "20" "color" : "white" } },
这里的抽象类是动物,而狗则扩展了动物类。因此,使用@class中的信息,我们可以直接实例化dog吗。这也是我在restTemplate中得到的响应
ResponseEntity<List<SomeListName>> response = restTemplate.exchange("http://10.150.15.172:8080/agencies", HttpMethod.GET, request, responseType);
执行此行时,将出现以下错误。由于POJO类是自动生成的,因此无法使用 @JsonTypeInfo之 类的 注释
我正在使用Spring Boot和Maven。控制台中出现此错误。
无法读取JSON:无法构造“ MyPOJO”的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器或使用其他类型信息进行实例化
@JsonTypeInfo通过遵循MixIn的方法,无论生成类的事实如何,都可以使用注释
@JsonTypeInfo
“混合注释是”:一种将注释与类相关联的方法,而无需修改(目标)类本身。 也就是说,您可以: 定义将混合类(或接口)的注释与目标类(或接口)一起使用,以使其看起来像目标类具有混合类具有的所有注释(出于配置序列化/反序列化)
“混合注释是”:一种将注释与类相关联的方法,而无需修改(目标)类本身。
也就是说,您可以:
定义将混合类(或接口)的注释与目标类(或接口)一起使用,以使其看起来像目标类具有混合类具有的所有注释(出于配置序列化/反序列化)
这样您就可以编写您的AnimalMixIn课程,例如
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 { }
并配置您的解串器
ObjectMapper mapper = new ObjectMapper(); mapper.getDeserializationConfig().addMixInAnnotations( Animal.class, AnimalMixIn.class);
由于您使用的spring启动,您可以查看以下博客文章,看你如何自定义ObjectMapper使用混入,自杰克逊对象映射器,尤其要注意混入的方法Jackson2ObjectMapperBuilder
Jackson2ObjectMapperBuilder
应该通过转换器设置使用ObjectMapper内部自定义RestTemplate,例如
ObjectMapper
RestTemplate
RestTemplate restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter(); jsonMessageConverter.setObjectMapper(objectMapper); messageConverters.add(jsonMessageConverter); restTemplate.setMessageConverters(messageConverters); return restTemplate;