【问题标题】:How to get DispatcherServeletInitializer functionality in Spring Boot如何在 Spring Boot 中获取 DispatcherServeletInitializer 功能
【发布时间】:2014-05-17 04:28:23
【问题描述】:

我们正在寻求将我们的项目迁移到 Spring Boot。但是不清楚如何在 Spring Boot 中复制AbstractAnnotationConfigDispatcherServletInitializer 的功能?

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
protected Class<?>[] getRootConfigClasses()
{
    return new Class<?>[]{AppConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses()
{
    return new Class<?>[]{WebappConfig.class};
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    registration.setAsyncSupported(true);
}

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

@Override
protected Filter[] getServletFilters()
{
    DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
    shiroFilter.setTargetFilterLifecycle(true);

    CompositeFilter compositeFilter = new CompositeFilter();
    compositeFilter.setFilters(ImmutableList.of(new CorsFilter(),shiroFilter));

    return new Filter[]{compositeFilter};
}

}

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    没有什么特别的,只是用引导注释标记你的AppInitializer

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    ...
    }
    

    我没试过,只是结合文档:

    通常,现有 WebApplicationInitializer 中的所有代码都可以移动到 SpringBootServletInitializer 中。如果您现有的应用程序有多个 ApplicationContext(例如,如果它使用 AbstractDispatcherServletInitializer),那么您可以将所有上下文源压缩到一个 SpringApplication 中。

    还有SpringBootServletInitializerJavaDocs:

    如果您的应用程序更复杂,请考虑使用其中一种 其他 WebApplicationInitializers。

    【讨论】:

    • Artem:使用库存初始化器的主要问题是您无法获得SpringApplication 功能。如果需要,您还可以使用 SpringBootServletInitializer 或自定义初始化程序中的 SpringApplicationBuilder 父和子方法来创建层次结构。
    【解决方案2】:

    AppConfigWebappConfig 父/子关系可以由 SpringApplicationBuilder 处理,尽管您也可以考虑平面层次结构。

    假设您要全力以赴,并运行嵌入式 servlet 容器,您可以将 FiltersServlets 直接注册为 bean。

    如果需要设置setAsyncSupported等内容,也可以使用ServletRegistrationBeanFilterRegistrationBean。最后一个选项是添加一个实现org.springframework.boot.context.embedded.ServletContextInitializer 的bean,然后自己进行注册。

    这样的事情可能会让你走得更远:

    @Bean
    public ServletRegistrationBean dispatcherServlet() {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                new DispatcherServlet(), "/");
        registration.setAsyncSupported(true);
        return registration;
    }
    
    @Bean
    public Filter compositeFilter() {
        CompositeFilter compositeFilter = new CompositeFilter();
        compositeFilter.setFilters(ImmutableList.of(new CorsFilter(), shiroFilter));
        return compositeFilter
    }
    

    另外,请查看参考手册http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-embedded-container中的此部分

    【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2018-07-07
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2019-03-21
    相关资源
    最近更新 更多