Преобразование списка xml строкового ответа службой rest в соответствующий объект java с использованием RestTemplate.postForObject (.....) - PullRequest
0 голосов
/ 23 мая 2019

У меня ниже XML, который я получаю от третьей стороны (служба отдыха)

<response>
<error>Document Too Small</error>
<error>Barcode Not Detected</error>
<error>Face Image Not Detected</error>
</response>

Я звоню сторонней службе с кодом ниже, который пытается преобразовать XML в соответствующий объект Java -

restTemplate.postForObject("/test", new HttpEntity<>(request, headers), Eror.class);

Мы добавили MappingJackson2XmlHttpMessageConverter-

    MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
    converter.getObjectMapper().registerModule(new JaxbAnnotationModule());

Ниже приведен код Eror.class -

@XmlRootElement(name = "response")
public class Eror {
    private List<String> error;

    public List<String> getError() {
        return error;
    }

    public void setError(List<String> error) {
        this.error = error;
    }
}

Тот же код работает хорошо, если у нас есть простые типы, такие какstring, int, но проблема возникает, когда у нас есть список строк.Я получаю следующее исключение -

 Exception cause - 
 org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of VALUE_STRING token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of VALUE_STRING token

К вашему сведению, если я выполнял ручной анализ с xml на соответствующую java с использованием jaxb marshaller, как показано ниже, он работал правильно -

    JAXBContext jaxbContext = JAXBContext.newInstance(Eror.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    Eror err = (Eror) jaxbUnmarshaller.unmarshal(new File("c:/error.xml"));

Любая помощьвысоко ценится.

1 Ответ

0 голосов
/ 23 мая 2019

Всегда лучше использовать Jaxb для xml для маршалинга и демаршаллинга. Тем не менее, если вы хотите использовать, Джексон способ делать. Вы должны сделать это следующим образом.

XmlMapper mapper = new XmlMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(mapper);
String xmlString = "your xml response";

try {
     Eror eror = mapper.readValue(xmlString, Eror.class);
     System.out.println("eror = " + eror);
  } catch (IOException e) {
      e.printStackTrace();
  }

Для лучшего понимания его использования, смотрите ссылки ниже. http://websystique.com/springmvc/spring-mvc-requestbody-responsebody-example/

https://www.concretepage.com/spring-4/spring-4-rest-xml-response-example-with-jackson-2

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverter.html

...