SpringBoot中@RequestBody接收XML时对象为null的问题求助
从你提供的代码和配置来看,导致XML请求无法正确绑定到File对象的原因可能有以下几点,我们逐一排查:
1. 实体类Getter/Setter方法命名不规范
看你的File实体类,属性定义是transactions,但对应的getter和setter方法却少了末尾的s:
public List<Transaction> getTransaction() { return transactions; } public void setTransaction(List<Transaction> transaction) { this.transactions = transaction; }
Spring的消息转换器(不管是Jackson还是JAXB)会通过方法名推断属性名称,它会认为属性是transaction而非transactions,这和你XML里的<transactionMTDs>以及注解配置完全不匹配,直接导致集合属性无法被正确注入,甚至可能影响整个对象的绑定。
修复方案:把方法名修正为与属性名匹配的形式:
public List<Transaction> getTransactions() { return transactions; } public void setTransactions(List<Transaction> transactions) { this.transactions = transactions; }
2. Jackson XML依赖的错误排除
你的pom.xml里对jackson-dataformat-xml做了完全错误的排除配置:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>${jackson.version}</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-dataformat-xml</artifactId> </exclusion> </exclusions> </dependency>
你直接排除了依赖本身,这会导致Spring Boot无法加载XML消息转换器,自然无法解析XML请求体并绑定到对象上,最终得到null。
修复方案:移除这个错误的排除配置,修改后的依赖如下:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>${jackson.version}</version> </dependency>
3. 请求头与接口配置不匹配
你的/save-file接口没有显式指定consumes属性,虽然Spring会默认支持常见的媒体类型,但如果你的请求没有携带Content-Type: application/xml头,Spring会选择错误的消息转换器(比如JSON转换器)来解析XML内容,最终导致绑定失败。
验证方案:调用接口时,务必在请求头中设置Content-Type: application/xml,同时确认请求路径是正确的/save-file。
4. JAXB注解的冗余配置
你的File类中使用了@XmlElements来声明子元素,但实际上你只有一种类型的子节点,这个注解属于冗余配置,反而可能带来解析歧义。可以简化为:
@XmlElementWrapper(name="transactionMTDs") @XmlElement(name="transactionMTD", type=Transaction.class) protected List<Transaction> transactions;
总结
优先修复Getter/Setter命名错误和Jackson依赖的错误排除这两个核心问题,这是导致对象绑定为null的最可能原因。同时确保请求头的Content-Type正确,请求路径与接口配置匹配。
内容的提问来源于stack exchange,提问作者user2702611

