在Spring中混合使用web.xml和AbstractAnnotationConfigDispatcherServletInitializer

时间:2016-05-10 11:46:56

标签: java spring session tomcat

我在Spring上有一个应用程序并使用Java Configs来配置和初始化我的应用程序,因此我没有web.xml。这是我的网络初始化程序的样子,

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{PublicApiConfig.class, MobileConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/*"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        LoggingFilter loggingFilter = new LoggingFilter();
        return new Filter[]{characterEncodingFilter, loggingFilter};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[0];
    }
}

我需要实现tomcat会话复制,为了达到目的,我需要将应用程序设为distributable。使用传统的web.xml,我可以添加<distributable/>属性,就是这样。但据我所知,没有办法通过Java Configs这样做。

我的问题是,是否可以使用混合的web.xml和java配置,例如

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <distributable/>

</web-app>

并将其包含在WebInitializer中。

2 个答案:

答案 0 :(得分:2)

根据Servlet 3.0规范,只要web-app版本&gt; = 3.0且metadata-complete属性为false(默认),就可以将web.xml与Programmatic servlet注册混合。使用当前配置,它应该可以正常工作

答案 1 :(得分:1)

您可以使用TomcatEmbeddedServletContainerFactory,然后使用

@Override
public void customize(Context context){
            context.setDistributable(true);
        }

您可以在此主题中找到完整的代码示例 spring-boot-application-with-embedded-tomcat-session-clustering

编辑:在这种情况下我没有使用Spring Boot,并且TomcatEmbeddedServletContainerFactory不可用

WebApplicationInitializer的javadoc说,可以将它与web.xml一起使用:

  

WEB-INF / web.xml与WebApplicationInitializer的使用并不相互排斥;例如,web.xml可以注册一个servlet,WebApplicationInitializer可以注册另一个servlet。初始化程序甚至可以通过ServletContext#getServletRegistration(String)等方法修改web.xml中执行的注册。