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

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

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

  1. @RestController
  2. class UserController {
  3. @PostMapping(path = "/herd", produces = APPLICATION_XML_VALUE, consumes = APPLICATION_XML_VALUE)
  4. void saveHerd(@RequestBody Users request) {
  5. println user.name
  6. }
  7. }

我的XML请求正文:

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

用户pojos:

  1. class Users {
  2. List<UserDTO> user
  3. }
  4. class UserDTO {
  5. String name
  6. String age
  7. }

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

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

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

gg0vcinb

gg0vcinb1#

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

  1. @XmlRootElement

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

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

  1. <dependency>
  2. <groupId>javax.xml.bind</groupId>
  3. <artifactId>jaxb-api</artifactId>
  4. <version>2.3.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.sun.xml.bind</groupId>
  8. <artifactId>jaxb-core</artifactId>
  9. <version>2.3.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.sun.xml.bind</groupId>
  13. <artifactId>jaxb-impl</artifactId>
  14. <version>2.3.0</version>
  15. </dependency>
展开查看全部
neekobn8

neekobn82#

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

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

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

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

  1. @JacksonXmlRootElement(localName = "xml")
  2. public class CommonMessageReq {
  3. @JacksonXmlProperty(localName = "ToUserName")
  4. @JacksonXmlCData
  5. private String toUserName;
  6. @JacksonXmlProperty(localName = "FromUserName")
  7. @JacksonXmlCData
  8. private String fromUserName;
  9. @JacksonXmlProperty(localName = "CreateTime")
  10. private Long createTime;
  11. @JacksonXmlProperty(localName = "MsgType")
  12. @JacksonXmlCData
  13. private String msgType;
  14. // ...omit getter/setter methods...
  15. }
  16. @PostMapping(consumes = {MediaType.APPLICATION_XML_VALUE})
  17. public ResponseEntity<String> handle(@RequestBody CommonMessageReq request) {
  18. // ...omit details
  19. }

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

展开查看全部
nkoocmlb

nkoocmlb3#

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

  1. <dependency>
  2. <groupId>jakarta.xml.bind</groupId>
  3. <artifactId>jakarta.xml.bind-api</artifactId>
  4. </dependency>

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

  1. @XmlRootElement
  2. public class Device implements Serializable{
  3. }

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

  1. @PostMapping(path="/xmlTest")
  2. public String testXml(@RequestBody Device device){
  3. return device.getMake() + device.getModel();
  4. }
展开查看全部

相关问题