关于码头:如何在spring-boot中设置上下文参数

How to set context-param in spring-boot

在经典的web.xml类型配置中,您可以像这样配置上下文参数

web.xml

1
2
3
4
5
6
...
<context-param>
  <param-name>p-name</param-name>
  <param-value>-value</param-value>
</context-param>
...

在spring-boot中如何实现。 我有一个需要参数的过滤器。

我正在使用@EnableAutoConfiguration,并且在pom中包含了spring-boot-starter-jetty


您可以通过声明ServletContextInitializer bean在整个ServletContext上设置参数:

1
2
3
4
5
6
7
8
9
10
@Bean
public ServletContextInitializer initializer() {
    return new ServletContextInitializer() {

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

更新:在Spring Boot 1.2中,不再需要使用ServletContextInitializer。现在,您可以在application.properties中的单行中在ServletContext上配置参数:

1
server.context_parameters.p-name=-value


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

例如:

1
2
3
4
5
6
7
8
9
@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上下文的参数。您的Application类可以扩展SpringBootServletInitializer,并且您可以覆盖onStartup方法并在那里设置参数。例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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 Wilkinson的建议定义ServletContextInitializer bean。


从Spring Boot 2.0.0开始,他们更新了添加上下文参数的方法:

1
server.servlet.context-parameters.yourProperty.

您可以在此链接上看到更多更新


您还可以在配置中定义InitParameterConfiguringServletContextInitializer。例:

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