我有一个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 documentationan 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 petcliniclocation="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/

10-09 04:14