2016-08-02 109 views
-1
  • 是否可以使用Spring ApplicationContextInitializer註冊新的servlet過濾器?
  • 或者有沒有一種方法可以訪問指定spring.factories中的自定義類的ServletContext?

後面的想法是創建一個小型庫,它會在庫添加到項目中時自動註冊servlet過濾器。如何使用spring.factories添加Servlet過濾器

也許有人有更好的想法如何從用戶透明地做到這一點,支持Spring Boot和最重要的純Spring(用於傳統應用程序)?

回答

1

你可以做到這一點很簡單,你要做的幾件事情:

1)創建適當的依賴關係的JAR模塊一個合適的行家/ gradle這個配置。

2)用你的Filter配置創建一個配置類。例如:

package com.test; 

@Configuration 
public class FilterConfig { 
    @Bean 
    public FilterRegistrationBean contextFilterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     RequestContextFilter contextFilter = new RequestContextFilter(); 
     registrationBean.setFilter(contextFilter); 
     registrationBean.setOrder(1); 
     return registrationBean; 
    } 
} 

3)創建文件的src /主/資源/ META-INF/spring.factories並添加:

4)發佈/安裝您的罐子,包括它的依賴你的Spring Boot應用程序。

在此之後,FilterConfig應自動加載您添加依賴關係的每個Spring Boot應用程序,其中使用@EnableAutoConfiguration(I.E.使用註釋@SpringBootApplication)。

+0

感謝您的解決方案和努力。不幸的是,我知道Spring Boot的這種解決方案。我希望能夠爲非Spring Boot應用程序實現相同的功能。因爲我需要支持一些傳統的Spring應用程序。 –

+0

沒有任何修改的非Spring Boot應用程序? – Ulises

+0

希望是的。這就是爲什麼我正在研究spring.factories和ApplicationContextInitializer。但從那時起,我無法訪問ServletContext。好的是,我們沒有太多遺留應用程序,其中大多數是Spring Boot,我可以使用你的方法。 –

0

Configuration類創建的Servlet豆如下:

@Bean 
public ServletRegistrationBean envServlet() { 
    EnvServlet envServlet = new EnvServlet(); 
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(envServlet, "/boot/env"); 
    servletRegistrationBean.setName("bootEnvServlet"); 
    return servletRegistrationBean; 
} 

彈簧將註冊org.springframework.boot.context.embedded.RegistrationBean的子類servlet容器。