Nin*_*ina 3 spring file-extension get media-type http-status-code-406
(请参阅2015年8月20日下方的编辑部分)
最近我遇到了类似的问题(Get请求仅适用于斜杠(spring REST注释)),解决方案是在@RequestMapping的值中添加一个正则表达式(另请参见Spring MVC @PathVariable被截断)。
但是,现在我们已经意识到问题仍然存在,但仅适用于以.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) {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果我致电: http:// myserver:8080 / myresource / value1 / value2 / value3
如果value3 = email@domain.de / co.uk / .name / .biz /.info,则完全没有问题。
但是,对于某些顶级域名(到目前为止,.com,.org),我收到Http状态码406(不接受)。
如果添加斜杠,它将起作用:
http:// myserver:8080 / myresource / value1 / value2 / value3 /
由于我们使用swagger并且swagger不会添加尾斜杠,因此不能添加尾斜杠。
什么可能导致此问题?
我使用一个ErrorHandler扩展了ResponseEntityExceptionHandler。我对其进行调试,发现抛出HttpMediaTypeNotAcceptableException(“找不到可接受的表示形式”)。但是我还不知道是谁在扔它,为什么扔。
我发现路径http:// myserver:8080/myresource/value1/value2/myemail@somewhere.com
被解释为文件,“ com”是媒体类型“ application / x-msdownload”的文件扩展名,因此在Spring的类matchMediaType中的类ProducesRequestCondition.ProduceMediaTypeExpression中,“ getMediaType()。isCompatibleWith(acceptedMediaType)”行失败,因为实际产生的媒体类型是“ application / json; charset = UTF-8”,而不是“ application / x-msdownload”。
所以问题变成了:我怎样才能让Spring理解.com不是文件扩展名?
该线程帮助了我: SpringMVC:不一致的映射行为取决于URL扩展
显然,这不是错误,而是“功能”,有两种不同的禁用方式。我使用了注释版本:
@Configuration
@EnableWebMvc
public class RestCommonsMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |