Spring MVC @RequestMapping 标头只能接受一个值?

Posted

技术标签:

【中文标题】Spring MVC @RequestMapping 标头只能接受一个值?【英文标题】:Spring MVC @RequestMapping headers can accept only one value? 【发布时间】:2011-06-25 02:58:45 【问题描述】:

这将起作用:

@RequestMapping(value = "/test", method = RequestMethod.POST,
    headers = "content-type=application/json") 
    .......

如果我像下面这样向它添加另一个值,那么它将失败并告诉我:

请求的资源不允许使用指定的 HTTP 方法 (不支持请求方法“POST”)

@RequestMapping(value = "/test", method = RequestMethod.POST,
    headers = "content-type=application/json","content-type=application/xml") 
    .......

我猜这是因为 Spring 认为这两个 content type 值具有“AND”关系,但我希望它们是“OR”。

有什么建议吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果您使用的是 Spring 3.1.x。您可以查看使用@RequestMapping 注解的consumesproduces 属性。这是有关改进的 Spring 博客文章:

http://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements/

来自上述文档的片段:

@RequestMapping(value="/pets", headers="Content-Type=application/json")
public void addPet(@RequestBody Pet pet, Model model) 
    // ...

替换为:

@RequestMapping(value="/pets", consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) 
    // ...

此外,如果您需要多种媒体类型。您可以执行以下操作:

produces="application/json", "application/xml"

consumes="application/json", "application/xml"

【讨论】:

我有一个疑问 - 当我写 produces = "application/xml" 时,它仍然给我错误 406。但是如果写 produces = "application/xml", headers = "Content-Type=application/xml" ,那么一切正常。所以我的问题是为什么produces不足以返回XML响应,需要headers来完成任务。【参考方案2】:

你试过content-type=application/json,application/xml吗?

不确定它是否会起作用,但我认为在其中放置两个 content-type 标头会赢。

可能在具有不同content-type 标头的同一方法上使用两个RequestMapping 注释?

【讨论】:

"content-type=application/json,application/xml" 工作!谢谢! @dave G 只有一个@RequestMapping 被方法接受

以上是关于Spring MVC @RequestMapping 标头只能接受一个值?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot为啥引入两个mapping会报错

Spring Cloud Spring Boot mybatis分布式微服务云架构(十三)使用Spring Security安全控制

Spring Boot2 系列教程 (十五) | 服务端参数校验之一

Spring MVC学习笔记---Spring MVC 的HelloWorld

Spring MVC学习笔记---Spring MVC 的HelloWorld

Spring MVC学习—MVC的介绍以及Spring MVC的入门案例