我正在尝试整理一个列表:List<Pojo>通过Spring Rest模板的对象。
List<Pojo>
我可以传递简单的Pojo对象,但是找不到任何描述如何发送List<Pojo>对象的文档。
Pojo
Spring正在使用Jackson JSON实现HttpMessageConverter。杰克逊文档涵盖了以下内容:
HttpMessageConverter
除了绑定到POJO和“简单”类型外,还有另一种变体:绑定到通用(类型化)容器。这种情况由于所谓的Type Erasure(类型擦除)(由Java用于以某种向后兼容的方式实现泛型)而需要进行特殊处理,从而阻止您使用类似的内容 Collection<String>.class(无法编译)。 因此,如果您要将数据绑定到中 Map<String,User>,则需要使用: Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() {}); TypeReference仅在哪里需要传递通用类型定义(在这种情况下,通过任意内部类):重要的部分是 <Map<String,User>>定义要绑定到的类型。
除了绑定到POJO和“简单”类型外,还有另一种变体:绑定到通用(类型化)容器。这种情况由于所谓的Type Erasure(类型擦除)(由Java用于以某种向后兼容的方式实现泛型)而需要进行特殊处理,从而阻止您使用类似的内容 Collection<String>.class(无法编译)。
Collection<String>.class
因此,如果您要将数据绑定到中 Map<String,User>,则需要使用:
Map<String,User>
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() {});
TypeReference仅在哪里需要传递通用类型定义(在这种情况下,通过任意内部类):重要的部分是 <Map<String,User>>定义要绑定到的类型。
TypeReference
<Map<String,User>>
可以在Spring模板中完成吗?我看了一眼代码,这使我不觉得什么,但也许我只是不知道一些技巧。
解
由于以下有用的答案,最终的解决方案是不发送List,而是发送仅扩展List的单个对象,例如:class PojoList extends ArrayList<Pojo>。Spring可以成功封送该Object,它完成与发送a相同的任务List<Pojo>,尽管它不太干净。我还在spring为他们发布了JIRA,以解决他们HttpMessageConverter界面中的这一缺陷。
class PojoList extends ArrayList<Pojo>
如果我阅读正确的文档MappingJacksonHttpMessageConverter,则必须创建并注册的子类MappingJacksonHttpMessageConverter并重写该getJavaType(Class<?>)方法:
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); } }