一尘不染

Spring / json:转换类似List的类型化集合

spring-mvc

我正在尝试整理一个列表:List<Pojo>通过Spring Rest模板的对象。

我可以传递简单的Pojo对象,但是找不到任何描述如何发送List<Pojo>对象的文档。

Spring正在使用Jackson JSON实现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>>定义要绑定到的类型。

可以在Spring模板中完成吗?我看了一眼代码,这使我不觉得什么,但也许我只是不知道一些技巧。


由于以下有用的答案,最终的解决方案是不发送List,而是发送仅扩展List的单个对象,例如:class PojoList extends ArrayList<Pojo>。Spring可以成功封送该Object,它完成与发送a相同的任务List<Pojo>,尽管它不太干净。我还在spring为他们发布了JIRA,以解决他们HttpMessageConverter界面中的这一缺陷。


阅读 353

收藏
2020-06-01

共1个答案

一尘不染

如果我阅读正确的文档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);
   }
}
2020-06-01