Обработка ответа JSON без элемента 'root' с RestEasy - PullRequest
0 голосов
/ 16 июня 2020
• 1000 1005 *

... и чтобы прочитать ответ на вызов WS в моем WS-клиенте, я пытаюсь:

Response response = responseWs.readEntity(Response.class);

... но получаю следующее исключение:

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: javax.xml.bind.UnmarshalException 
 - with linked exception: 
[com.sun.istack.internal.SAXParseException2; columnNumber: 0 unexpected element ... Expected elements are

Это потому, что мой код пытается обработать такой объект ответа JSON (с некоторым элементом 'root'):

{
    "response":
    {
        "error_code": "02",
        "message": "Param not valid",
        "field_name": "title"
    }       
}

Кто-нибудь знает, как я могу решить эту ситуацию на моей стороне ?

Спасибо

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Из размещенного вами фрагмента кода

Response response = responseWs.readEntity (Response.class);

Я бы порекомендовал использовать другое имя для вашего объекта сущности . Класс Response также используется самой структурой jaxrs.

Я предполагаю, что вы используете RestEasyClient для вызова этой (внешней) службы для получения JSON. Если понятно, что ответ от этой службы находится в JSON, вы можете использовать JSON (jackson) marshaller / unmarshaller вместо JAXB. Предполагая, что у вас уже есть зависимость «resteasy-client», доступная в вашем пути к классам. Форма этой зависимости maven выглядит следующим образом:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.19.Final</version>
</dependency>

  1. Измените имя DTO на что-то ExternalServiceResponse
  2. При выполнении GET запроса вы явно указываете ответ тип носителя
Response response = target.request(MediaType.APPLICATION_JSON).get();
ExternalServiceResponse result = response.readEntity(ExternalServiceResponse.class)
Наконец, я не понимаю, почему вам нужно указывать аннотацию @XmlRootElement в вашем DTO
public class ExternalServiceResponse implements Serializeable {

    private String error_code;
    private String message;
    private String field_name;

    public String getError_code() {
        return error_code;
    }
    public void setError_code(String error_code) {
        this.error_code = error_code;
    }

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public String getField_name() {
        return field_name;
    }
    public void setField_name(String field_name) {
        this.field_name = field_name;
    }

}
0 голосов
/ 17 июня 2020

Для меня этот фрагмент решает проблему:

String responseAsString = responseWs.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
JsonNode pathNode = mapper.readTree(responseAsString);
Response response = mapper.convertValue(pathNode, Response.class);
0 голосов
/ 16 июня 2020

Там, где вы настроили JAXB (файл свойств или метод конфигурации), вы должны установить jaxbUnmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false)

...