我在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
中。
答案 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中执行的注册。