.com电子邮件地址的“获取请求”失败,因为Spring将其解释为扩展名

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不是文件扩展名?

Nin*_*ina 5

该线程帮助了我: SpringMVC:不一致的映射行为取决于URL扩展

显然,这不是错误,而是“功能”,有两种不同的禁用方式。我使用了注释版本:

@Configuration
@EnableWebMvc
public class RestCommonsMvcConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
  }
}
Run Code Online (Sandbox Code Playgroud)