Проблема десериализации JSON с Spring RestTemplate

Bleow — это json, который необходимо преобразовать в объект с помощью шаблона Spring Rest.

{"userResponse": {
   "build": 1,
   "code": 400,
   "status": "Failed",
   "validationErrors":    [
            {
         "fieldName": "userId",
         "message": "User Id is NOT in valid format"
      },
            {
         "fieldName": "password",
         "message": "Password cannot be less than 8 characters"
      }
   ]
}}

Проблема здесь, когда список элементов для validationErrors является частью ответа.

Ниже приведена конфигурация шаблона Spring Rest.

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">   
    <property name="messageConverters">
        <list> 
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >          
                <property name="supportedMediaTypes" value="application/json" /> 
            </bean>             
        </list>
    </property>   
</bean>

Ниже приведен код для вызова postForObject.

restTemplate.postForObject( "ServiceUrl", "userinput", Registration.class );

Ниже приведена ошибка, возникающая при вызове службы.

org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:90)
    at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:494)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:451)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409)

Пожалуйста, предоставьте некоторые данные для решения проблемы.


person user2533804    schedule 29.06.2013    source источник
comment
Как выглядит ваш Registration класс?   -  person nicholas.hauschild    schedule 29.06.2013


Ответы (2)


Ваш «userinput» должен быть строкой в ​​формате JSON, а это не так, поэтому служба, с которой вы пытаетесь связаться, вероятно, отвечает «неверным запросом», потому что вы отправляете недействительный JSON.

документация по API рассказывает о том, как нужно форматировать параметры для этого метода. Вы должны убедиться, что публикуете правильно отформатированный JSON (я бы рекомендовал использовать объект Java и сериализовать его с помощью Джексона следующим образом:

ObjectMapper mapper = new ObjectMapper();
ObjectWriter normalWriter = mapper.writer();
String jsonString = normalWriter.writeValueAsString(objectToMakeJson);
person CorayThan    schedule 29.06.2013
comment
Я могу отправить запрос на обслуживание с помощью метода postForObject. userinput — это объект запроса. ServiceUrl — это фактический URL-адрес. Но проблема в том, что когда ответ содержит список объектов, как указано в примере, JSON НЕ десериализуется в объект. Примечание: его десериализация, если ответ не содержит списка объектов. - person user2533804; 01.07.2013

Как уже упоминалось, ваш "userinput" должен быть действительным JSON (например, {"userinput" : {"dataKey" : "dataValue"}}). Также не ясно, является ли "ServiceUrl" заполнителем для фактического URL-адреса в предоставленном вами фрагменте, убедитесь, что URL-адрес также действителен.

person Bizmarck    schedule 29.06.2013