如何解决Spring / json:转换类型化的集合,例如List <MyPojo>
|| 我正在尝试整理列表:通过Spring Rest模板的ѭ0个对象。 我可以传递简单的“ 1”对象,但是找不到描述如何发送“ 0”对象的文档。 Spring正在使用Jackson JSON实现ѭ3。杰克逊文档涵盖了以下内容: 除了绑定到POJO和 “简单”类型,有一种 附加变体:与 通用(类型)容器。这个案例 由于需要特殊处理 所谓的类型擦除(由Java使用 在某种程度上实现泛型 向后兼容的方式), 阻止您使用类似Collection<String>.class
(
无法编译)。
因此,如果您要将数据绑定到
Map<String,User>
,您将需要使用:
Map<String,User> result = mapper.readValue(src,new TypeReference<Map<String,User>>() {});
只需TypeReference
传递通用类型定义(通过
在这种情况下的任意内部类):
重要的部分是
定义类型的8ѭ
绑定。
可以在Spring模板中完成吗?我看了一眼代码,它使我不觉得什么,但也许我只是不知道一些技巧。
解
由于以下有用的回答,最终的解决方案是不发送列表,而是发送仅扩展列表的单个对象,例如:class PojoList extends ArrayList<Pojo>
。 Spring可以成功地封送该Object,并且完成与发送ѭ0相同的任务,尽管它不太干净。我在春季还为他们发布了JIRA,以解决他们在HttpMessageConverter
界面中的缺点。
解决方法
如果我正确阅读了ѭ12the的文档,则必须创建并注册
MappingJacksonHttpMessageConverter
的子类并重写getJavaType(Class<?>)
方法:
返回Jackson的Jackson类型。
具体类别。默认实现
退货
TypeFactory.type(java.lang.reflect.Type),
但这可以被覆盖
子类,以允许自定义
通用集合处理。对于
实例:
protected JavaType getJavaType(Class<?> clazz) {
if (List.class.isAssignableFrom(clazz)) {
return TypeFactory.collectionType(ArrayList.class,MyBean.class);
} else {
return super.getJavaType(clazz);
}
}
, 在Spring 3.2中,现在在RestTemplate
上使用新的exchange()
-方法支持泛型类型:
ParameterizedTypeReference<List<MyBean>> typeRef = new ParameterizedTypeReference<List<MyBean>>() {};
ResponseEntity<List<MyBean>> response = template.exchange(\"http://example.com\",HttpMethod.GET,null,typeRef);
奇迹般有效!
, 确保包括通用类型参数的一种方法是实际上对List或Map类型进行子类化,以使您拥有类似以下内容的东西:
static class MyStringList extends ArrayList<String> { }
并返回该列表的实例。
那么,为什么会有不同呢?因为泛型类型信息仅保留在几个地方:方法和字段声明以及超类型声明。因此,尽管\“ raw \” List不包括任何运行时类型信息,但是\“ MyStringList \”的类定义通过其超类型声明进行了定义。
请注意,对看似类型化的变量的分配无济于事:它只会创建更多的编译时语法糖:实类型信息仅与Class实例(或其lib提供的扩展,如在Jackson的情况下的JavaType和TypeReference)一起传递。
除此之外,您将需要弄清楚如何通过JacksonJavaType
或TypeReference
来陪伴价值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。