2014-10-29 29 views
14

在经典的web.xml配置类型,你可以配置诸如上下文参数所以如何设置的context-param春季启动

的web.xml

... 
<context-param> 
    <param-name>p-name</param-name> 
    <param-value>-value</param-value> 
</context-param> 
... 

这是如何在春季启动实现。我有一个需要参数的过滤器。

我使用的是@EnableAutoConfiguration,并且在我的pom中包含了<artifactId>spring-boot-starter-jetty</artifactId>

+0

查看application.properties选项的文档。他们中的许多人可以在一行中解决:) http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix。 – 2015-09-01 09:02:46

回答

33

您可以对整个ServletContext通过声明ServletContextInitializer bean中设置的参数:

@Bean 
public ServletContextInitializer initializer() { 
    return new ServletContextInitializer() { 

     @Override 
     public void onStartup(ServletContext servletContext) throws ServletException { 
      servletContext.setInitParameter("p-name", "-value"); 
     } 
    }; 
} 

更新。您可以在application.properties在单行现在配置上ServletContext参数:

server.context_parameters.p-name=-value 
+0

你的答案出现在我正在做的关于如何使用Spring Boot定义过滤器列表的一些相当广泛的研究中。我一直在记录我的研究。你愿意对此发表评论吗?这里是链接:http://stackoverflow.com/questions/36489253/api-url-has-an-empty-filter-list-in-spring-boot-security – CodeMed 2016-04-08 21:21:56

7

您实际上可以使用Java配置来实现此目的。如果你有需要一些参数的过滤器,只需将它们放入你的application.yml(或.properties)中,在你的配置类中使用@Value注入它们并在FilterRegistrationBean中注册它们。

例如:

@Value("${myFilterParam}") 
private String myFilterParam; 

@Bean(name="myFilter") 
public FilterRegistrationBean myFilter() { 
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter()); 
    filterRegistrationBean.setInitParameters(Collections.singletonMap("p-name", "p-value")); 
    return filterRegistrationBean; 
} 

FilterRegistrationBean另外的JavaDoc:

http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/embedded/FilterRegistrationBean.html

更新

可以在SpringBootServletInitializer#onStartup()方法注册servlet上下文参数。您的应用程序类可以扩展SpringBootServletInitializer,您可以覆盖onStartup方法并在其中设置参数。例如:

@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     servletContext.setInitParameter("p-name", "p-value"); 
     super.onStartup(servletContext); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class); 
    } 

} 

其它替代是由Andy威尔金森所建议定义ServletContextInitializer豆。使用ServletContextInitializer不再需要在春季启动1.2:

+0

道歉,我的意思是询问关于上下文的参数,而不是初始参数。我已经更新了这个问题来反映这一点。 – 2014-10-30 07:46:03

0

你也可以在你的配置定义InitParameterConfiguringServletContextInitializer。示例:

@Bean 
public InitParameterConfiguringServletContextInitializer initParamsInitializer() { 
    Map<String, String> contextParams = new HashMap<>(); 
    contextParams.put("p-name", "-value"); 
    return new InitParameterConfiguringServletContextInitializer(contextParams); 
}