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)一起传递。 除此之外,您将需要弄清楚如何通过Jackson
JavaType
TypeReference
来陪伴价值。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...