Подтвердить что ты не робот

Как установить context-param в spring -boot

В классической конфигурации типа web.xml вы можете настроить такие параметры контекста, как

web.xml

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

Как это достигается в spring -boot. У меня есть фильтр, который требует параметров.

Я использую @EnableAutoConfiguration и включил <artifactId>spring-boot-starter-jetty</artifactId> в мой pom.

4b9b3361

Ответ 1

Вы можете установить параметры в целом ServletContext, объявив ServletContextInitializer bean:

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

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

Обновить: в Spring Загрузка 1.2 с помощью ServletContextInitializer больше не требуется. Теперь вы можете настроить параметр на ServletContext в одной строке в application.properties:

server.context_parameters.p-name=-value

Ответ 2

Фактически вы можете добиться этого, используя конфигурацию 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;
}

Также JavaDoc для FilterRegistrationBean:

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

Обновление

Вы можете зарегистрировать параметры для контекста сервлета в методе SpringBootServletInitializer#onStartup(). Класс Application может расширять 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);
    }

}

Другой альтернативой является определение ServletContextInitializer bean, предложенное Энди Вилкинсоном.

Ответ 3

Также вы можете определить InitParameterConfiguringServletContextInitializer в своей конфигурации. Пример:

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