有标头时请求映射不起作用
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/json
是 Content-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 标头基本授权不起作用