如果xml元素命名约定与POJO属性命名约定不同,则发送到Spring Boot REST API的XML元素不会映射到POJO
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果xml元素命名约定与POJO属性命名约定不同,则发送到Spring Boot REST API的XML元素不会映射到POJO相关的知识,希望对你有一定的参考价值。
当我向REST控制器发送XML有效负载时,未按预期映射。我的实现是通过使用Spring Boot完成的。我使用JaxB基于XSD文件生成了POJO。仅当XML元素遵循POJO中遵循的相同命名约定时,才会映射XML元素。
<Declaration xmlns:p="My_Common_Types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MY_Schema.xsd">
<ID>ID</ID>
<Regime>REG</Regime>
</Declaration>
使用JAXB生成的代码如下,
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "id", "regime" }) @XmlRootElement(name = "Declaration") public class Declaration { @XmlElement(name = "ID") protected String id; @XmlElement(name = "Regime") protected String regime; public String getID() { return id; } public void setID(String value) { this.id = value; } public String getRegime() { return regime; } public void setRegime(String value) { this.regime = value; } }
休息控制器如下,
@RestController public class XMLConsumerController { @PostMapping("/xmlPayload") public void decodeXML(@RequestBody Declaration xmlPayLoad) { } }
pom.xml依赖关系如下,
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
真的很感激,如果有人可以帮我解决这个问题。
答案
删除jackson-dataformat-xml依赖项并将起作用。
更新:
使用粘贴的xml,通过Postman。正文以text / xml格式发送。我的依赖关系如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
它工作正常
更新2:
从错误响应中的消息,它看起来它期望声明的命名空间,即使我没有在你发布的类中看到它。可能在package-info.java中指定了一个名称空间。
好的尝试使用此正文请求:
<p:Declaration xmlns:p="My_Common_Types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MY_Schema.xsd">
<ID>ID</ID>
<Regime>REG</Regime>
</p:Declaration>
它可能仍然失败,但绝对不会抱怨宣言。如果它涉及ID或Regime,则在有效负载中添加'p'前缀并重复。
以上是关于如果xml元素命名约定与POJO属性命名约定不同,则发送到Spring Boot REST API的XML元素不会映射到POJO的主要内容,如果未能解决你的问题,请参考以下文章