Java Webjars定位器不';不能使用基于XML的SpringMVC4.2.x配置吗?

Java Webjars定位器不';不能使用基于XML的SpringMVC4.2.x配置吗?,java,spring,spring-mvc,classpath,webjars,Java,Spring,Spring Mvc,Classpath,Webjars,我有一个springmvc4.2.x项目。我正在通过基于XML的配置文件进行配置: <servlet> <servlet-name>foo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name&

我有一个
springmvc4.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>
除了一件事外,一切正常:
webjars定位器
-webjars定位器根本不工作


我已经开始研究Spring MVC源代码,以了解出了什么问题,并发现
webjars定位器
通过
WebJarsResourceResolver
类工作,该类的对象添加到
ResourceChainRegistration.getResourceResolver()
类方法中

整个序列如下所示:

WebMVCCConfiguration支持.resourceHandlerMapping()
ResourceHandlerRegistration.getHandlerMapping()>>
ResourceHandlerRegistration.getRequestHandler()
>>
ResourceChainRegistration.getResourceResolver()
,其中添加为:

if (isWebJarsAssetLocatorPresent) {
    result.add(new WebJarsResourceResolver());
}
问题在于,对于上述基于XML的配置,不会调用此序列,也不会使用
WebMvcConfigurationSupport

此外,如果我加上

@EnableWebMvc
@Configuration
public class WebConfig {
}
在项目中,
WebMvcConfigurationSupport
显然有效,但在
ResourceHandlerRegistration.getHandlerMapping()
中:

注册
为空


毕竟,强制Spring将
WebJarsResourceResolver
添加到解析器链中的唯一方法是:

1) 从
上下文.xml中删除
,然后

2) 将
addResourceHandlers
添加到
WebConfig

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
            .addResourceHandler("/webjars/**")
            .addResourceLocations("/webjars/")
            .setCachePeriod(3600)
            .resourceChain(true)  // !!! very important
    ;
}


我的问题是:我做错了什么?为什么XML基配置不会导致注册
WebJarsResourceResolver

假设上下文根路径是
/ctx
。通过您的配置,资源路径
/webjars/resource
实际上映射到
/ctx/webjars/resource
;与通常的期望相反,它应该映射到
/webjars/RESOURCE

基于和,您需要将
/webjars/**
映射到默认的dispatcher 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 />

哈所以问题只在于
,我不知道用XML指定它的这种明显方式,谢谢!这仍然不能回答为什么webjar文档中没有描述它的问题,但我接受它,因为它以所需的方式解决了问题!
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
            .addResourceHandler("/webjars/**")
            .addResourceLocations("/webjars/")
            .setCachePeriod(3600)
            .resourceChain(true)  // !!! very important
    ;
}
<mvc:resources mapping="/webjars/**" location="/webjars/">
    <mvc:resource-chain>
        <mvc:resource-cache />
    </mvc:resource-chain>
</mvc:resources>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<mvc:resources mapping="/webjars/**" location="/webjars/">
    <mvc:resource-chain resource-cache="true"/>
</mvc:resources>