Spring Android - десериализация объектов JSON, вызывающая проблемы при наследовании - PullRequest
3 голосов
/ 14 апреля 2011

У меня возникла проблема с десериализацией объекта 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: ОШИБКА / AndroidRuntime (4359): вызвано: org.springframework.web.client.ResourceAccessException: ошибка ввода-вывода: нераспознанное поле «filed3» (класс com.xx.yy.model.Ball), не помеченное как игнорируемоесторона обслуживания, я предоставляю список бейсбола в качестве ответа.Может кто-нибудь указать мне на решение, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 27 января 2013

Spring Недавно выпущенный (3.2.0.RELEASE), и они добавили MappingJackson2HttpMessageConverter, который решил похожую проблему, с которой я столкнулся. MappingJackson2HttpMessageConverter использует Jackson 2 для десериализации, в то время как MappingJacksonHttpMessageConverter использует версию 2.0 до Jackson. Попробуйте добавить следующий конвертер к вашему RestTemplate и попробуйте.

MappingJackson2HttpMessageConverter map = new MappingJackson2HttpMessageConverter();
messageConverters.add(map);
restTemplate.setMessageConverters(messageConverters);
0 голосов
/ 14 апреля 2011

Это не совсем проблема Android.Система смотрит на ваши вещи с уровня Ball и, следовательно, вы получаете исключение Unrecognized field "field3".Также я объявил бы acceptibleMediaType как ArrayList, поскольку List не сериализуем.

Я бы попытался создать и отправить ArrayList<BaseBall>, просто чтобы посмотреть, работает ли он, а затем перейти оттуда

...