Spring Android - 反序列化JSON对象,在存在继承时导致问题

时间:2011-04-13 21:16:14

标签: android spring resttemplate

我遇到了反序列化POJO对象的问题。

以下是服务端的POJO对象的结构。

Class Ball{
    int field1;
    int field2;

}

Class BaseBall extends Ball
{
    int field3;
    int field4;
}

Class BallList{
    List<Ball> balls;
}

即使在Android客户端,我也有类似的POJO对象结构。

Android客户端代码:

RestTemplate restTemplate = new RestTemplate();

List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(new MediaType("application","json"));

HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);

HttpEntity<String> entity = new HttpEntity<String>(headers);

ResponseEntity<BallList> response = restTemplate.exchange(
    url, HttpMethod.GET, entity, BallList.class);

if(response.getStatusCode() == HttpStatus.OK)
{
    result += "OK";
}
  

04-13 18:17:46.127:ERROR / AndroidRuntime(4359):引起:org.springframework.web.client.ResourceAccessExcep tion:I / O错误:无法识别的字段“filed3”(类com.xx.yy .model.Ball),未标记为可忽略的

在服务方面,我提供棒球列表作为回应。任何人都可以指出我的解决方案。

2 个答案:

答案 0 :(得分:0)

这不是Android问题。系统会从Ball级别查看您的内容,因此会出现Unrecognized field "field3"异常。此外,我会将acceptibleMediaType声明为ArrayList,因为List不可序列化。

我会尝试创建并发送ArrayList<BaseBall>只是为了查看它是否有效然后从那里开始

答案 1 :(得分:0)

Spring最近发布(3.2.0.RELEASE)并且他们添加了MappingJackson2HttpMessageConverter,它解决了我遇到的类似问题。 MappingJackson2HttpMessageConverter使用Jackson 2进行反序列化,而MappingJacksonHttpMessageConverter使用2.0之前的Jackson。尝试将以下转换器添加到RestTemplate并尝试一下。

MappingJackson2HttpMessageConverter map = new MappingJackson2HttpMessageConverter();
messageConverters.add(map);
restTemplate.setMessageConverters(messageConverters);