有标头时请求映射不起作用

Posted

技术标签:

【中文标题】有标头时请求映射不起作用【英文标题】:Requestmapping not working when there is headers 【发布时间】:2014-11-03 22:04:00 【问题描述】:

在我的控制器中,我有一个运行良好的方法

@RequestMapping(value="/searchresults",method = RequestMethod.GET)
public SearchResponse searchResults(
@PathVariable("domain") String domain,
@RequestParam(value="rowCount" , defaultValue="0",  required=false) Integer rowCount,
HttpServletRequest req)

但添加标题时同样的事情不起作用,

@RequestMapping(value="/searchresults", method = RequestMethod.GET,headers = "application/json;charset=UTF-8")
public SearchResponse searchResults(
@PathVariable("domain") String domain,
@RequestParam(value="rowCount" , defaultValue="0",  required=false) Integer rowCount,
HttpServletRequest req)

例外: 表示:空 org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException:没有找到 servle 的匹配处理程序方法 t 请求:路径'/search/searchresults.json',方法'GET',

我尝试如下,

@RequestMapping(value="/searchresults", method = RequestMethod.GET,headers = "content-type=application/json,charset=UTF-8")

但它会抛出, java.lang.IllegalArgumentException: "charset=UTF-8" 不包含'/'

如何解决

【问题讨论】:

【参考方案1】:

我发现这很有用(被 Spring 3.0.x 卡住了):

@ResponseBody
public ResponseEntity<String> getResponse() 
  String body = ...
  MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
  headers.set("Content-Type", "application/json;charset=UTF-8");
  return new ResponseEntity<String>(body, headers, HttpStatus.OK);

【讨论】:

【参考方案2】:

对于那些使用 WebLogic 的人来说,有一种解决方法,而其他应用程序服务器可能也会这样做,这就是 weblogic.xml

中对我有用的方法
<wls:charset-params>
        <wls:input-charset>
              <wls:resource-path>/restful</wls:resource-path>
              <wls:java-charset-name>UTF-8</wls:java-charset-name>
        </wls:input-charset>
</wls:charset-params>   

我的请求映射注释如下所示:

@RequestMapping(method = RequestMethod.POST, value = "/echo", produces = "text/plain;charset=UTF-8", headers = "Accept=*/*")

添加

headers = "content-type=application/json,charset=UTF-8"

没有帮助,我很困惑为什么,但我以某种方式逃脱了。高温

【讨论】:

【参考方案3】:

使用;而不是,

@RequestMapping(value="/searchresults", method = RequestMethod.GET,headers = "content-type=application/json;charset=UTF-8")

【讨论】:

【参考方案4】:

headers 更改为produces

@RequestMapping(value="/searchresults", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public SearchResponse searchResults(
@PathVariable("domain") String domain,
@RequestParam(value="rowCount" , defaultValue="0",  required=false) Integer rowCount,
HttpServletRequest req)

如果您使用的是 Spring 4,理想情况下应该使用 @RestController

【讨论】:

【参考方案5】:

您忘记添加标题名称:|

application/jsonContent-Type,而UTF-8字符集

看看complete list of HTTP headers。

正确的映射将是:

@RequestMapping(value="/searchresults", method = RequestMethod.GET, 
                       headers = "content-type=application/json,charset=UTF-8")

也就是说,值得知道 ContentType should be specified only for POST and PUT requests。

【讨论】:

【参考方案6】:

您还需要指定标题名称,即content-type。改变这个:

headers ="application/json;charset=UTF-8"

headers = "content-type=application/json,charset=UTF-8"

【讨论】:

我试过 headers = "content-type=application/json,charset=UTF-8" 但它抛出 java.lang.IllegalArgumentException: "charset=UTF-8" does not contain '/ '

以上是关于有标头时请求映射不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用

Polymer.js iron-ajax 标头基本授权不起作用

AngularJS和rails cors标头不起作用

带有请求标头“范围”的 .NET HttpClient 不起作用

Spring MVC 请求映射不起作用

用于基本授权的 ajax 设置标头不起作用