【问题标题】:Mixing web.xml and AbstractAnnotationConfigDispatcherServletInitializer in Spring在 Spring 中混合 web.xml 和 AbstractAnnotationConfigDispatcherServletInitializer
【发布时间】:2016-09-05 09:05:00
【问题描述】:

我在 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,我可以添加 &lt;distributable/&gt; 属性,仅此而已。然而据我所知,没有办法通过 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 中。

【问题讨论】:

  • 是的,您可以混合使用它们,但我不明白的是,即使存在此 web.xml,您也会收到 web.xml 不存在的错误?

标签: java spring session tomcat


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。但是如何在 WebInitializer 类中包含这个 web-fragment.xml 文件?通过导入?
【解决方案2】:

你可以使用一个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 可以注册另一个。初始化程序甚至可以通过 ServletContext#getServletRegistration(String) 等方法修改在 web.xml 中执行的注册。

【讨论】:

  • 这种情况下我没有使用Spring Boot,TomcatEmbeddedServletContainerFactory不可用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2017-10-01
  • 2017-08-30
  • 1970-01-01
  • 2011-11-30
  • 2014-10-02
相关资源
最近更新 更多