Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果XML元素命名约定不同于POJO属性命名约定,则发送到Spring Boot REST API的XML元素不会映射到POJO_Xml_Rest_Web Services_Spring Boot_Jaxb - Fatal编程技术网

如果XML元素命名约定不同于POJO属性命名约定,则发送到Spring Boot REST API的XML元素不会映射到POJO

如果XML元素命名约定不同于POJO属性命名约定,则发送到Spring Boot REST API的XML元素不会映射到POJO,xml,rest,web-services,spring-boot,jaxb,Xml,Rest,Web Services,Spring Boot,Jaxb,当我向REST发送XML有效负载时,控制器并没有按预期映射。我的实现是通过使用SpringBoot完成的。我已经使用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"

当我向REST发送XML有效负载时,控制器并没有按预期映射。我的实现是通过使用SpringBoot完成的。我已经使用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; } } @RestController public class XMLConsumerController { @PostMapping("/xmlPayload") public void decodeXML(@RequestBody Declaration xmlPayLoad) { } }
<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>
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name=),比例={ “身份证”, “体制” }) @XmlRootElement(name=“声明”) 公共类声明{ @xmlement(name=“ID”) 受保护的字符串id; @XmlElement(name=“体制”) 保护串制度; 公共字符串getID(){ 返回id; } 公共void setID(字符串值){ this.id=值; } 公共字符串{ 回归制度; } 公共无效设置机制(字符串值){ 这个制度=价值; } } Rest控制器如下所示:

@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) { } }
<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>
@RestController 公共类XMLConsumerController{ @后映射(“/xmlPayload”) 公共void decodeXML(@RequestBody声明xmlPayLoad){ } } pom.xml依赖项如下所示:

@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) { } }
<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>

org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧起动试验
测试
com.fasterxml.jackson.dataformat
jackson数据格式xml
org.springframework.boot
弹簧启动机tomcat
假如

如果有人能帮我解决这个问题,我将不胜感激。

删除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>

org.springframework.boot
spring启动程序父级
1.4.3.1发布
org.springframework.boot
SpringBootStarterWeb
而且效果很好

更新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)hm bad request?这很奇怪。我已经使用了您发布和发送的xml描述。唯一的区别可能是pom。我会在回复中更新。请尝试一下,让我知道我也尝试过你的依赖关系。但它不起作用。同样的事情发生了。我使用相同的机制(Postman)发送有效负载。如果xml遵循命名约定,会发生什么?奇怪的是,它认为这是一个错误的请求。它会给你额外的信息吗?为什么这是一个糟糕的要求?您是否仔细检查了发送的xml?