如何在Spring Boot中获取DispatcherServlet Initializer功能

时间:2014-04-04 18:00:30

标签: java spring spring-mvc spring-boot

我们希望将项目迁移到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};
}

}

2 个答案:

答案 0 :(得分:3)

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

假设您正在进行整个工作,并运行嵌入式servlet容器,您可以直接将FiltersServlets注册为bean。

如果您需要设置ServletRegistrationBean等内容,也可以使用FilterRegistrationBeansetAsyncSupported。最后一个选项是添加一个实现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

中的此部分

答案 1 :(得分:2)

没有什么特别的,比如用引号注释标记你的AppInitializer

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

我还没有尝试过,但只是结合了文档:

  

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

SpringBootServletInitializer JavaDocs:

  

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