一尘不染

Spring Boot Controller内容协商

spring-boot

我在Spring-boot应用程序中编写了一个简单的REST控制器,但是我不确定如何实现内容协商以使其基于请求标头中的Content-
Type参数返回JSON或XML。有人可以告诉我,我在做什么错?

控制器方式:

@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
  public Message getMessageXML(@RequestParam("text") String text) throws Exception {
    Message message = new Message();
    message.setDate(new Date());
    message.setName("Test");
    message.setAge(99);
    message.setMessage(text);

    return message;
  }

调用此方法时,我总是会得到JSON(即使我Content-Type将be 指定为application/xmltext/xml)。

当我实现两个具有不同映射和不同内容类型的方法时,我可以从xml中获取XML,但是如果我在一个方法中指定两个mediaType(如提供的示例),则该XML不起作用。

我想要的是呼叫\message端点并接收

  • GET请求的Content-Type设置为application / xml时的XML
  • 内容类型为application / json时的JSON

任何帮助表示赞赏。

编辑:我更新了我的控制器以接受所有媒体类型

@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }, consumes = MediaType.ALL_VALUE)
  public Message getMessageXML(@RequestParam("text") String text) throws Exception {
    Message message = new Message();
    message.setDate(new Date());
    message.setName("Vladimir");
    message.setAge(35);
    message.setMessage(text);

    return message;
  }

阅读 389

收藏
2020-05-30

共1个答案

一尘不染

您可以在第6点的带有Produces和Consumes的博客帖子@RequestMapping中找到一些提示。

请注意有关Content-Type和Accept标头的部分:

带有Produces和Consumes的@RequestMapping:我们可以使用标头Content-
Type和Accept来查找请求内容以及响应中想要的mime消息是什么。为了清楚起见,@
RequestMapping提供产生和使用变量,我们可以在其中指定将为其调用方法的请求内容类型以及响应内容类型。例如:

@RequestMapping(value="/method6",

produces={“application/json”,”application/xml”}, consumes=”text/html”)
@ResponseBody
public String method6(){
return “method6”;
}

上面的方法只能使用Content-Type为text / html的消息,并且能够产生application / json和application /
xml类型的消息。

您也可以尝试使用这种不同的方法(使用ResponseEntity对象),该方法允许您找出传入的消息类型并生成相应的消息(还利用@ResponseBody批注)

2020-05-30