Spring + Thymeleaf资源处理程序与RequestMapping冲突

时间:2016-10-25 14:16:31

标签: java spring spring-mvc spring-boot thymeleaf

注册"通用" @RequestMapping我的资源处理程序停止了工作。

起初我有这个资源配置,有Thymeleaf:

@Value("${ty-resource}")    
private String resource;

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    registry.addResourceHandler("/resources/**").addResourceLocations(resource);
}

我的资源不在项目之内,因此我的客户可以根据自己的意愿更新资源(他要求)。

一切都很好,我的资源来自${user.dir}/../webapp/resources/

然后我注册了@RequestMapping(value="/{department}/{category}/{subCategory}")

然后我的资源开始被这个请求映射响应,而不是来自资源处理程序。

我不知道如何解决这个问题。

我想到了这个:

@Value("${ty-resource}")
private String resourcesPath;

@RequestMapping('/resources')
public ModelAndView resources(@RequestParam("r") String resource) {
    return new ModelAndView("redirect:"+resourcesPath+resource);
}

但我不认为这可能是最好的答案。

即使尝试此操作,因为@RequestMapping(value="/{department}/{category}/{subCategory}")的注册时间早于@RequestMapping('/resources'),我的资源会被@RequestMapping(value="/{department}/{category}/{subCategory}")回复。

- 编辑 -

示例:

<script type="text/javascript" data-th-src="@{/resources/js/components.js}"></script>

此资源请求不是由资源处理程序响应的。 spring将其作为@RequestMapping(value="/{department}/{category}/{subCategory}")

的匹配项

2 个答案:

答案 0 :(得分:0)

这就是我使用Thymeleaf加载资源的方式

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

并使用html中的绝对路径将资源加载为

<script th:src="@{/resources/js/validation.js}"></script>

请查看How to harness url in Spring MVC?所选答案。 希望这会有所帮助。

答案 1 :(得分:0)

我通过在控制器中实现Ordered接口解决了这个问题。

所以我为控制器设置了一个更大的命令,我希望将其作为最后一个解决。