如何强制Spring Boot的@RequestBody接受XML

yuvru6vn  于 2022-09-21  发布在  Spring
关注(0)|答案(3)|浏览(413)

我有一个带有Groovy(JDK 11)的Spring引导应用程序,我想接受一个XML请求体。这是我的控制器:

@RestController
class UserController {
    @PostMapping(path = "/herd", produces = APPLICATION_XML_VALUE, consumes = APPLICATION_XML_VALUE)
    void saveHerd(@RequestBody Users request) {
        println user.name
    }
}

我的XML请求正文:

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user name="foo" age="4"/>
    <user name="Jack" age="8"/>
</users>

用户pojos:

class Users {
    List<UserDTO> user
}

class UserDTO {
    String name
    String age
}

问题是我的请求返回的内容类型为‘APPLICATION/XML;CHARSET=UTF-8’不受支持]

如果我调试我的应用程序,我发现Spring Web出于某种原因仍然期待一个JSON,即使我已经将Consumer指定为XML。

为什么Spring-Boot仍然期待JSON而不是XML?

gg0vcinb

gg0vcinb1#

尝试在Users.class上添加以下类级别的注解

@XmlRootElement

如果包含jaxb库,也要检查maven,因为您没有提到您使用的是哪个JDK。您需要这个库来编组解组XML,但是从JDK 11和更高版本中删除了这个库。

编辑:由于您使用的是JDK 11,并且此版本中删除了jaxb,因此添加了以下依赖项

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-core</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.0</version>
</dependency>
neekobn8

neekobn82#

我不确定这对你是否有效,但它肯定对我有效。

我使用的是Java 17,并添加了这个库:

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'

在模型中,我在类上使用@JacksonXmlRootElement,在其属性上使用JacksonXmlProperty,如果需要接受CDATA部分中的值,则使用@JacksonXmlCData

@JacksonXmlRootElement(localName = "xml")
public class CommonMessageReq {
    @JacksonXmlProperty(localName = "ToUserName")
    @JacksonXmlCData
    private String toUserName;
    @JacksonXmlProperty(localName = "FromUserName")
    @JacksonXmlCData
    private String fromUserName;
    @JacksonXmlProperty(localName = "CreateTime")
    private Long createTime;
    @JacksonXmlProperty(localName = "MsgType")
    @JacksonXmlCData
    private String msgType;

    // ...omit getter/setter methods...
}

@PostMapping(consumes = {MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<String> handle(@RequestBody CommonMessageReq request) {
    // ...omit details
}

无论如何,它是JAXB的替代库。

nkoocmlb

nkoocmlb3#

在pom.xml中添加以下依赖项

<dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
</dependency>

使用@XmlRootElement注解POJO,POJO必须实现Serializable来编组和解组XML

@XmlRootElement
public class Device implements Serializable{
}

控制器同时接受XML和json,除非使用Consumer=MediaType.APPLICATION_XML_VALUE将其限制为XML

@PostMapping(path="/xmlTest")
    public String testXml(@RequestBody Device device){
        return device.getMake() + device.getModel();
    }

相关问题