【发布时间】:2017-05-26 11:26:48
【问题描述】:
我有一个Spring MVC 4.2.x 项目。我正在通过基于XML 的配置文件进行配置:
<servlet>
<servlet-name>foo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在context.xml文件中我已经配置了资源和annotation-driven模式:
<mvc:resources mapping="/webjars/**" location="/webjars/"/>
<mvc:annotation-driven/>
一切正常,除了一件事:webjars-locator - Webjars 定位器根本不起作用。
我已经开始查看 Spring MVC 源代码以了解发生了什么问题,并发现 webjars-locator 通过 WebJarsResourceResolver 类工作,该对象是在 ResourceChainRegistration.getResourceResolvers() 类方法中添加的。
完整的序列如下:
WebMvcConfigurationSupport.resourceHandlerMapping() >> ResourceHandlerRegistration.getHandlerMapping() >> ResourceHandlerRegistration.getRequestHandler() >>
ResourceChainRegistration.getResourceResolvers(),这里添加为:
if (isWebJarsAssetLocatorPresent) {
result.add(new WebJarsResourceResolver());
}
问题在于,在上述基于 XML 的配置的情况下,不会调用此序列,也不会使用 WebMvcConfigurationSupport 类。
此外,如果我添加
@EnableWebMvc
@Configuration
public class WebConfig {
}
进入项目,WebMvcConfigurationSupport 显然有效,但在ResourceHandlerRegistration.getHandlerMapping():
protected AbstractHandlerMapping getHandlerMapping() {
if (registrations.isEmpty()) {
return null;
}
...
}
registrations 是空的!
毕竟,如何强制让Spring将WebJarsResourceResolver添加到解析器链中的唯一一种方法是:
1) 从context.xml 中删除<mvc:resources mapping="/webjars/**" location="/webjars/"/> 和
2) 将addResourceHandlers 添加到WebConfig:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/webjars/**")
.addResourceLocations("/webjars/")
.setCachePeriod(3600)
.resourceChain(true) // !!! very important
;
}
我的问题是:我做错了什么?为什么基于 XML 的配置不会导致 WebJarsResourceResolver 被注册?
【问题讨论】:
标签: java spring spring-mvc classpath webjars