当前位置: 首页 > 知识库问答 >
问题:

如果XML元素命名约定与POJO属性命名约定不同,则发送到spring boot REST API的XML元素不映射到POJO

经福
2023-03-14

当我向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",
        "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;
        }
    }

Rest控制器如下所示,


    @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>

真的很感谢有人能帮我解决这个问题。

共有1个答案

单于旭东
2023-03-14

移除jackson-DataFormat-XML依赖项将会起作用。

更新:

通过邮递员使用粘贴的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中指定了一个名称空间。

Ok尝试使用该请求得主体:

<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'前缀并重复。

 类似资料:
  • 我希望将XML反序列化为Java Pojo,但我不需要所有元素,并且我希望避免创建样板包装类来获取一些子元素 例如-->现在不起作用

  • 本文向大家介绍wpf 绑定到另一个命名元素的属性,包括了wpf 绑定到另一个命名元素的属性的使用技巧和注意事项,需要的朋友参考一下 示例 您可以绑定到命名元素上的属性,但是命名元素必须在范围内。            

  • 本文向大家介绍aurelia 基于命名约定创建自定义元素,包括了aurelia 基于命名约定创建自定义元素的使用技巧和注意事项,需要的朋友参考一下 示例 通过CustomElement在类名中简单地添加后缀,即可基于命名约定在Aurelia中创建一个基本的自定义元素。此后缀将由Aurelia自动删除。类名称的其余部分将被小写并使用连字符分隔,然后可用作元素名称。 示例: my-element.js

  • 为了在跨API开发中向开发者提供一致的开发体验,所有的命名应该保证: 简单 直观 一致 这适用于接口、资源、集合、方法以及消息的命名。 因为很多开发者并非以英语作为母语,所以命名约定的目标之一是确保大多数开发者可以更容易理解 API。对于方法和资源,我们鼓励使用简单、直观和一致的单词来命名。 API 中的命名应该使用正确的美式英语。例如,使用美式英语的 license 而非英式英语的 licenc

  • 在本节,我们不会讨论适用于大规模和可维护的最佳 CSS 命名方案,因为这不仅仅超过了个人的能力范围,也不是一个Sass样式指南可以解决的问题。我个人推荐遵从 CSS Guidelines 的建议。 良好的命名对保持整体代码的一致性和可读性非常重要,在 Sass 中可以命名的地方如下: 变量; 函数; 混合宏。 由于 Sass 占位符遵循和类名相同的命名模式,因此被视为常规的 CSS 选择器,也就在

  • 函数名 小技巧 使用小写字母,并用下划线分隔单词。使用双冒号 :: 分隔库。函数名之后必须有圆括号。关键词 function 是可选的,但必须在一个项目中保持一致。 如果你正在写单个函数,请用小写字母来命名,并用下划线分隔单词。如果你正在写一个包,使用双冒号 :: 来分隔包名。大括号必须和函数名位于同一行(就像在Google的其他语言一样),并且函数名和圆括号之间没有空格。 # Single fu