问题描述
||
我正在尝试整理列表:通过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
来陪伴价值。