如果XML元素命名约定不同于POJO属性命名约定,则发送到Spring Boot REST API的XML元素不会映射到POJO
当我向REST发送XML有效负载时,控制器并没有按预期映射。我的实现是通过使用SpringBoot完成的。我已经使用JaxB基于XSD文件生成了POJO。仅当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"
<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?