Java 在春季混合使用web.xml和AbstractAnnotationConfigDispatcherServletInitializer

Java 在春季混合使用web.xml和AbstractAnnotationConfigDispatcherServletInitializer,java,spring,session,tomcat,Java,Spring,Session,Tomcat,我在Spring上有一个应用程序,使用JavaConfigs来配置和初始化我的应用程序,因此我没有web.xml。下面是我的web初始值设定项的外观 public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override public void onStartup(ServletContext servletContext) throws Servle

我在Spring上有一个应用程序,使用JavaConfigs来配置和初始化我的应用程序,因此我没有
web.xml
。下面是我的web初始值设定项的外观

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];
    }
}
公共类WebInitializer扩展AbstractAnnotationConfigDispatcherServletInitializer{
@凌驾
启动时公共void(ServletContext ServletContext)引发ServletException{
super.onStartup(servletContext);
}
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{PublicApiConfig.Class,MobileConfig.Class};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{”/*“};
}
@凌驾
受保护的筛选器[]getServletFilters(){
CharacterEncodingFilter CharacterEncodingFilter=新的CharacterEncodingFilter();
characterEncodingFilter.setEncoding(“UTF-8”);
LoggingFilter LoggingFilter=新的LoggingFilter();
返回新筛选器[]{characterEncodingFilter,loggingFilter};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[0];
}
}
我需要实现tomcat会话复制,为了达到这个目的,我需要将应用程序作为一个组件。使用传统的web.xml,我可以添加
属性,就是这样。然而,据我所知,没有办法通过Java配置实现这一点

我的问题是,是否可以混合使用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

您可以使用TomcatEmbeddedServletContainerFactory

@Override
public void customize(Context context){
            context.setDistributable(true);
        }
您可以在该线程中找到完整的代码示例


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

的javadoc表示,可以将其与web.xml一起使用:

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


根据Servlet 3.0规范,只要web应用版本>=3.0且元数据完整属性为false(默认),就可以将web.xml与编程Servlet注册混合使用。对于您当前的配置,它应该可以工作

是的,您可以将它们混合使用,但我不明白的是,即使有了这个web.xml,您也会发现web.xml不存在的错误?感谢您的回复。但是如何在WebInitializer类中包含这个web-fragment.xml文件呢?通过导入?在这种情况下,我没有使用Spring Boot,TomcatEmbeddedServletContainerFactory不可用