Spring MVC路径模式匹配不会处理破折号

时间:2015-04-18 20:45:05

标签: java regex spring spring-mvc ant

我有一个@Configuration类,使用与此类似的方法扩展WebMvcConfigurerAdapter

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQuery-File-Upload*/**").addResourceLocations("/jQuery-File-Upload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

尝试访问这些静态资源时,Spring与配置的资源处理程序(404错误或类似错误)不匹配URL(例如http://localhost:8080/app/jQuery-File-Upload-9.9.3/js/file.js)。如果我更改文件系统上的目录名称并从模式中删除初始破折号,那么它可以工作(例如使用http://localhost:8080/app/jQueryFileUpload-9.9.3/js/file.js):

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQueryFileUpload*/**").addResourceLocations("/jQueryFileUpload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

我尝试稍微调试一下,可以看到Spring使用org.springframework.util.AntPathMatcher来处理这些模式。该类中的代码非常混乱,我知道Spring过去曾遇到过与模式/路径相关的错误。这是另一个缺陷吗?我如何修改上面的代码,以便它可以工作,而不必像我在解决方法中那样删除破折号?

使用Spring 4.1.6和Java 8.

更新

删除的回复建议以某种方式“逃脱”破折号。请注意,以下内容也不起作用:

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQuery\\-File\\-Upload*/**").addResourceLocations("/jQuery-File-Upload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

1 个答案:

答案 0 :(得分:1)

给出以下配置:

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
  r.addResourceHandler("/resources/foo-*/**").addResourceLocations("/static/");
}

GET /app/resources/foo-bar/file.js之类的请求会尝试解析磁盘上的以下内容:/static/foo-bar/file.js。 Spring正在获取请求的模式部分(给定您已配置的模式) - 请参阅AntPathMatcher.extractPathWithinPattern

因此,在您的情况下,我认为它实际上是在尝试解决"/jQuery-File-Upload-9.9.3/jQuery-File-Upload-9.9.3/js/file.js"

我设法在模式定义中使用"-"解析资源。

要获得更多指导,将LOG级别转为org.springframework.web.servlet.resource的DEBUG应该会为我们提供更多信息。

如果您设法隔离并重现此问题,请create a repro project和/或JIRA issue