我有一个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()
,添加为:if (isWebJarsAssetLocatorPresent) {
result.add(new WebJarsResourceResolver());
}
问题在于,在上述基于XML的配置中,不会调用此序列,也不使用
ResourceHandlerRegistration.getHandlerMapping()
类。此外,如果我添加
@EnableWebMvc
@Configuration
public class WebConfig {
}
进入项目后,
ResourceHandlerRegistration.getRequestHandler()
显然可以工作,但是在ResourceChainRegistration.getResourceResolvers()
中:protected AbstractHandlerMapping getHandlerMapping() {
if (registrations.isEmpty()) {
return null;
}
...
}
WebMvcConfigurationSupport
为空! 毕竟,如何强制使Spring将
WebMvcConfigurationSupport
添加到解析器链的唯一方法是:1)从
ResourceHandlerRegistration.getHandlerMapping()
中删除registrations
并2)将
WebJarsResourceResolver
添加到<mvc:resources mapping="/webjars/**" location="/webjars/"/>
中:@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/webjars/**")
.addResourceLocations("/webjars/")
.setCachePeriod(3600)
.resourceChain(true) // !!! very important
;
}
我的问题是:我在做什么错?为什么基于XML的配置不会导致
context.xml
被注册? 最佳答案
假设上下文根路径是/ctx
。使用您的配置,实际上将资源路径/webjars/RESOURCE
映射到/ctx/webjars/RESOURCE
;与通常的预期相反,应该将其映射到/webjars/RESOURCE
。
基于Spring 4.2.x documentation和an example similar issue,您需要将/webjars/**
映射为默认的调度程序servlet,如下所示:
这允许将DispatcherServlet映射到“/”(从而覆盖了容器默认Servlet的映射),同时仍允许容器默认Servlet处理静态资源请求。它使用URL映射“/ **”配置DefaultServletHttpRequestHandler,并且相对于其他URL映射具有最低优先级。
这意味着添加以下内容可以解决此问题:
<mvc:resources mapping="/webjars/**" location="/webjars/">
<mvc:resource-chain>
<mvc:resource-cache />
</mvc:resource-chain>
</mvc:resources>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
另一个注意事项the example petclinic将
location="classpath:/META-INF/resources/webjars/"
用于webjars,但我不确定此处是否相关。希望这可以帮助。
由@Andremoniy添加:
对于
Spring 4
,它的标记略有不同:<mvc:resources mapping="/webjars/**" location="/webjars/">
<mvc:resource-chain resource-cache="true"/>
</mvc:resources>
关于java - Webjars-locator不能与基于XML的Spring MVC 4.2.x配置一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44200423/