【问题标题】:How to set context-param in spring-boot如何在spring-boot中设置上下文参数
【发布时间】:2014-12-25 16:42:10
【问题描述】:

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

web.xml

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

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

我正在使用 @EnableAutoConfiguration 并在我的 pom.xml 中包含 &lt;artifactId&gt;spring-boot-starter-jetty&lt;/artifactId&gt;

【问题讨论】:

标签: spring-mvc jetty spring-boot


【解决方案1】:

自 Spring Boot 2.0.0 以来,他们更新了添加上下文参数的方式:

server.servlet.context-parameters.yourProperty.

你可以在这个link看到更多更新

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      @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 上的参数:

      server.context_parameters.p-name=-value
      

      【讨论】:

      • 您的答案来自我正在做的关于如何使用 Spring Boot 定义过滤器列表的一些相当广泛的研究。我一直在记录我的研究。你愿意对此发表评论吗?这是链接:stackoverflow.com/questions/36489253/…
      • @Andy 如何以编程方式为 servlet 2.5 设置上下文参数?
      • Spring Boot 不支持 Servlet 2.5。
      【解决方案4】:

      您实际上可以使用 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 上下文注册参数。您的 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);
          }
      
      }
      

      其他替代方法是按照 Andy Wilkinson 的建议定义 ServletContextInitializer bean。

      【讨论】:

      • 抱歉,我是想问上下文参数,而不是初始化参数。我已更新问题以反映这一点。
      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 2019-12-25
      • 2017-04-13
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2016-05-03
      相关资源
      最近更新 更多