如果 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的主要内容,如果未能解决你的问题,请参考以下文章

XML名命空间

如何验证XML架构中的命名约定

xml的命名空间

从 xml 的元素中提取命名空间属性

使用命名空间和前缀的 JAXB 解组

匹配具有命名空间属性的 XML 元素时遇到问题