(参见下面2015年8月20日的编辑部分)
我最近也遇到了类似的问题(获取请求仅适用于尾部斜杠(Spring REST 注释) https://stackoverflow.com/questions/31117009/get-request-only-works-with-trailing-slash-spring-rest-annotations),解决方案是将正则表达式添加到 @RequestMapping 的值(另请参见Spring MVC @PathVariable 被截断 https://stackoverflow.com/questions/3526523/spring-mvc-pathvariable-getting-truncated).
但现在我们意识到问题仍然存在,但仅限于以 .com 或 .org 结尾的电子邮件地址。这很奇怪。
不久,我使用 Spring Annotations 构建了一个 REST 服务。我有一个带有三个参数的 GET 请求,最后一个是电子邮件。
我的控制器:
@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3:.+}",
produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")
public ResponseEntity<MyResponseType> getMyResource(
@ApiParam(value = "...",...)
@PathVariable("value1") String value1,
@ApiParam(value = "...",...)
@PathVariable("value2") String value2,
@ApiParam(value = "...",...)
@PathVariable("value3") String value3) {
//...
}
如果我打电话:http://myserver:8080/myresource/value1/value2/value3 http://myserver:8080/myresource/value1/value2/value3
值3=[电子邮件受保护] /cdn-cgi/l/email-protection/co.uk/.name/.biz/.info,完全没有问题。
但对于某些顶级域(到目前为止,.com、.org),我收到 Http 状态代码 406(不接受)。
如果我添加尾部斜杠,它会起作用:
http://myserver:8080/myresource/value1/value2/value3/ http://myserver:8080/myresource/value1/value2/value3/
由于我们使用 swagger 并且 swagger 不添加尾部斜杠,因此添加尾部斜杠不是一个选项。
什么可能会导致这个问题?
我使用扩展 ResponseEntityExceptionHandler 的 ErrorHandler。
我对其进行了调试,发现抛出了 HttpMediaTypeNotAcceptableException(“无法找到可接受的表示”)。但我还不知道是谁扔的以及为什么。
edit
我发现这条路http://myserver:8080/myresource/value1/value2/[电子邮件受保护] http://myserver:8080/myresource/value1/value2/myemail@somewhere.com
被解释为文件,“com”是媒体类型“application/x-msdownload”的文件扩展名,因此在 Spring 的类 ProducesRequestCondition.ProduceMediaTypeExpression 方法 matchMediaType 中,“getMediaType().isCompatibleWith(acceptedMediaType)”行失败,因为实际生成的媒体类型是“application/json;charset=UTF-8”,而不是“application/x-msdownload”。
所以问题变成:如何让 Spring 理解 .com 不是文件扩展名?