web-dev-qa-db-fra.com

Comment définir context-param dans Spring-Boot

Dans la configuration de type web.xml classique, vous pouvez configurer des paramètres de contexte comme ceci

web.xml

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

Comment cela est-il réalisé dans Spring-Boot? J'ai un filtre qui nécessite des paramètres.

J'utilise @EnableAutoConfiguration et ont inclus <artifactId>spring-boot-starter-jetty</artifactId> dans mon pom.

22
dom farr

Vous pouvez définir des paramètres sur l'ensemble ServletContext en déclarant un bean ServletContextInitializer:

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

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

pdate: dans Spring Boot 1.2, l'utilisation d'un ServletContextInitializer n'est plus nécessaire. Vous pouvez maintenant configurer un paramètre sur ServletContext sur une seule ligne dans application.properties:

server.context_parameters.p-name=-value
40
Andy Wilkinson

Vous pouvez réellement y parvenir en utilisant Java config. Si vous avez un filtre qui nécessite certains paramètres, placez-les simplement dans votre application.yml (ou .properties), injectez-les en utilisant @Value dans votre classe de configuration et enregistrez-les dans FilterRegistrationBean.

Par exemple:

@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;
}

Aussi JavaDoc pour FilterRegistrationBean:

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

Mise à jour

Vous pouvez enregistrer des paramètres pour le contexte de servlet dans la méthode SpringBootServletInitializer#onStartup(). Votre classe Application peut étendre le SpringBootServletInitializer et vous pouvez remplacer la méthode onStartup et y définir les paramètres. Exemple:

@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);
    }

}

Une autre alternative est de définir ServletContextInitializer bean comme suggéré par Andy Wilkinson.

7
Bohuslav Burghardt

Vous pouvez également définir InitParameterConfiguringServletContextInitializer dans votre configuration. Exemple:

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