Dav*_*rks 32 java collections spring spring-mvc jackson
我正在尝试List<Pojo>
通过Spring Rest模板封送列表:对象.
我可以传递简单的Pojo
对象,但我找不到任何描述如何发送List<Pojo>
对象的文档.
Spring正在使用Jackson JSON来实现HttpMessageConverter
.杰克逊的文档涵盖了这一点:
除了绑定到POJO和"简单"类型之外,还有一个附加变体:绑定到通用(类型)容器的变体.这种情况需要特殊处理,因为所谓的类型擦除(Java用于以某种向后兼容的方式实现泛型),这会阻止您使用类似
Collection<String>.class
(不能编译)的东西.因此,如果要将数据绑定到a
Map<String,User>
,则需要使用:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() {});
其中
TypeReference
只需要通过通用类型定义(经由anynomous内部类在这种情况下):在重要的部分是<Map<String,User>>
限定类型结合.
这可以在Spring模板中完成吗?我瞥了一眼代码,它让我不是,但也许我只是不知道一些技巧.
解
由于下面的有用答案,最终解决方案是不发送List,而是发送一个简单扩展List的对象,例如:class PojoList extends ArrayList<Pojo>
.Spring可以成功封送这个Object,它完成了与发送一样的东西List<Pojo>
,尽管它不是一个简洁的解决方案.我还在春季发布了一个JIRA,以便他们在HttpMessageConverter
界面中解决这个缺点.
oeh*_*che 40
在Spring 3.2中,现在支持使用以下新exchange()
方法的泛型类型RestTemplate
:
ParameterizedTypeReference<List<MyBean>> typeRef = new ParameterizedTypeReference<List<MyBean>>() {};
ResponseEntity<List<MyBean>> response = template.exchange("http://example.com", HttpMethod.GET, null, typeRef);
Run Code Online (Sandbox Code Playgroud)
奇迹般有效!
Sta*_*Man 23
确保包含泛型类型参数的一种方法实际上是子类List或Map类型,这样您就可以:
static class MyStringList extends ArrayList<String> { }
Run Code Online (Sandbox Code Playgroud)
并返回该列表的实例.
那为什么会有所作为呢?因为泛型类型信息仅保留在几个地方:方法和字段声明以及超类型声明.因此,"raw"List不包含任何运行时类型信息,"MyStringList"的类定义通过其超类型声明来实现.注意,对看似类型化的变量的赋值没有帮助:它只是创建了更多的编译时语法糖:真实类型信息只传递给类实例(或者lib提供的扩展,如杰克逊的JavaType和TypeReference).
除此之外,你需要弄清楚如何通过杰克逊JavaType
或TypeReference
陪伴价值.
Sea*_*oyd 10
如果我阅读了正确的文档MappingJacksonHttpMessageConverter
,您将必须创建并注册子类MappingJacksonHttpMessageConverter
并覆盖该getJavaType(Class<?>)
方法:
返回特定类的Jackson JavaType.默认实现返回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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
30878 次 |
最近记录: |