【问题标题】:Autmapping of xml list of string response by rest service to respective java object using RestTemplate.postForObject(.....)使用 RestTemplate.postForObject(.....) 将 rest 服务的字符串响应的 xml 列表自动映射到相应的 java 对象
【发布时间】:2019-05-23 13:27:12
【问题描述】:

我有以下从第三方获取的 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;
    }
}

如果我们有像字符串、整数这样的简单类型,同样的代码可以正常工作,但是当我们有字符串列表时就会出现问题。 我得到以下异常 -

 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

仅供参考,如果我使用 jaxb marshaller 手动从 xml 解析到相应的 java,那么它可以正常工作 -

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

非常感谢任何形式的帮助。

【问题讨论】:

  • 我还是无法理解问题,一旦我得到,我会帮助你。你能告诉我确切的问题吗,因为我看到你已经写了 jaxb unmarshaller。
  • jaxb unmarshaller 是我可以将 xml 转换为 java 对象的一种方法。当我们处理休息服务时,resttemplate 提供了自动完成这项工作的工具。在这里,我无法将 xml 元素列表转换为相应的 java 对象。我希望它会有所帮助。
  • 我明白了,你想让 MappingJackson2XmlHttpMessageConverter 自动转换对象吗?
  • 是的。这就是我想要的
  • 好的,我帮你解决。

标签: jackson jaxb resttemplate spring-restcontroller jackson-databind


【解决方案1】:

使用 Jaxb for 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

【讨论】:

  • 感谢您的回复,但这对我没有帮助。实际上,使用现有配置,我能够解析其他 xml,例如 Arvind。但问题在于我给出的列表。
  • 我认为,错误应该有另一个根元素,因为您会收到重复的错误详细信息。
  • 您是否从第三方得到相同的响应?可以分享 uri 来测试吗?
  • 是的。 -- 获取响应的 uri - mocky.io/v2/5ce6c8e33300001d81731845
猜你喜欢
  • 2016-03-19
  • 2016-06-07
  • 2020-01-01
  • 2019-07-22
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多