Spring不会忽略文件扩展名

在我的Spring XML中,我有以下代码段:

          

据我所知,这意味着当我有一个“abc”的映射时,Spring不应该注册“abc。*”和“abc /”。

在我的一个控制器中,我有一个将图像写入响应的方法:

 @RequestMapping(value="{path}", method=RequestMethod.GET, produces=MediaType.IMAGE_PNG_VALUE) @ResponseBody public void getPath( @PathVariable String path, HttpServletResponse res) { ... } 

当我请求类似“abc”的东西时,这很有用,但是当我请求“abc.com”时,它会在文本中抛出406错误:

 The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers." 

当我请求“abc.img”时,“path”参数只接收文本“abc”; Spring省略了扩展名。

看来Spring似乎没有正确地忽略后缀模式。 为什么是这样?

编辑我从Dirk的评论中翻译了java配置,以下XML似乎解决了这个问题:

           

我仍然不确定为什么原来的代码不起作用,但这解决了我的问题

当请求进入spring调度程序时,控制器映射/匹配的一部分将客户端上接受的媒体类型与控制器端的可生成媒体类型相匹配(因此您可以拥有仅可通过其生成的媒体类型区分的控制器) 。

坏消息是springmvc在其默认配置中支持请求的URL超过请求中的任何accept头。

在您的示例中,当您请求abc时,扩展程序上没有匹配项,因此其他有争议的协商策略正在最终解析为正确的类型(通过accept标头)。 但是如果你请求abc.com spring将派生一个mime类型的application/octet-stream ,它与你的控制器的produces不匹配并生成406 (因为没有匹配的控制器)。

您可以在org/springframework/mail/javamail/mime.types中的spring-context-support.jar中找到路径扩展的默认mime匹配(请参阅https://github.com/spring-projects/spring-framework/blob /master/spring-context-support/src/main/resources/org/springframework/mail/javamail/mime.types#L278 )。

您可以在调度程序配置中禁用此“function”,因此Spring不会使用路径扩展来解析mime类型:

    

如果您使用的是java配置,请查看我的相关问题/答案 。

Interesting Posts