如果 xml 元素命名约定与 POJO 属性命名约定不同,则发送到 Spring Boot REST API 的 XML 元素不会映射到 POJO
Posted
技术标签:
【中文标题】如果 xml 元素命名约定与 POJO 属性命名约定不同,则发送到 Spring Boot REST API 的 XML 元素不会映射到 POJO【英文标题】:XML elements send to Spring Boot REST API is not mapped to POJO if xml element naming convention is different to POJO attribute naming convention 【发布时间】:2018-08-12 06:48:42 【问题描述】:当我向 REST 控制器发送 XML 有效负载时,未按预期映射。我的实现是使用 Spring Boot 完成的。我已经使用 JaxB 基于 XSD 文件生成了 POJO。仅当 XML 元素遵循 POJO 中遵循的相同命名约定时,它们才会被映射。
<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”, “政权” ) @XmlRootElement(name = "声明") 公共类声明 @XmlElement(name = "ID") 受保护的字符串 id; @XmlElement(name = "制度") 受保护的字符串机制; 公共字符串 getID() 返回标识; 公共无效集ID(字符串值) this.id = 值; 公共字符串 getRegime() 退货制度; 公共无效setRegime(字符串值) this.regime = 价值;Rest Controller如下,
@RestController 公共类 XMLConsumerController @PostMapping("/xmlPayload") 公共无效 decodeXML(@RequestBody 声明 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>
如果有人能帮我解决这个问题,我真的很感激。
【问题讨论】:
【参考方案1】:删除 jackson-dataformat-xml 依赖项即可使用。
更新:
通过 Postman 使用您粘贴的 xml。正文作为 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 或政权有关,则在有效负载中添加“p”前缀并重复。
【讨论】:
移除依赖后,它给出了一个错误的请求(状态码400) 嗯,请求不好?这很奇怪。我已经使用了您发布的内容并发送了描述的 xml。唯一的区别可能在于pom。我会在回复中更新。请尝试并告诉我 我也尝试过使用您的依赖项。但它没有用。同样的事情发生了。而且我使用相同的机制(邮递员)来发送有效载荷。 如果你的 xml 遵循命名约定会发生什么?奇怪的是它认为这是一个错误的请求。 它会给你额外的信息吗?为什么这是一个糟糕的要求?您是否仔细检查了发送的 xml?以上是关于如果 xml 元素命名约定与 POJO 属性命名约定不同,则发送到 Spring Boot REST API 的 XML 元素不会映射到 POJO的主要内容,如果未能解决你的问题,请参考以下文章