【问题标题】:SpringBoot with @Value property in Filter is null过滤器中具有 @Value 属性的 Spring Boot 为空
【发布时间】:2018-05-24 18:31:45
【问题描述】:

我正在使用 SpringBoot 的 @Value 注释从默认的 application.properties 文件中填充对象属性,但在过滤器覆盖中看到了一些奇怪的行为。

我的调试器中有两个断点:

@Component
  public class BasicFilter implements Filter {

  @Value("${aad.client_id}")
  private String clientId;

  @Bean
  public FilterRegistrationBean registerFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new BasicFilter()); // <-- 1.
    registration.addUrlPatterns("/secure/*");
    return registration;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {
    if (request instanceof HttpServletRequest) { // <- 2.
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        ...

在 1.:this.client_id 设置为 'foo'(来自 application.properties A2 2.:this.client_id 为空

对不同/缺失值的任何解释?

【问题讨论】:

  • 向我们展示您声明的属性文件条目

标签: java spring-boot


【解决方案1】:

您将new BasicFilter() 注入FilterRegistrationBean。在这种情况下,您正在创建一个新对象,但它不是 Spring 托管 bean,因此其 clientId 将为空。所以基本上你现在有 2 个实例:

  1. 由于 @Component 注释由 Spring 创建的一个
  2. 使用new 关键字注入FilterRegistrationBean(不由Spring 管理)

您可能应该将registerFilter() 方法移动到单独的配置类(使用@Configuration) 注释并将BasicFilter bean 自动装配/注入到该方法中,例如:

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean registerFilter(BasicFilter filter) { // Inject it
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter); // Use it
        registration.addUrlPatterns("/secure/*");
        return registration;
   }
}

另外,如果您想在过滤器本身中保留@Bean 方法,则应将其替换为this,因为当前对象由Spring 管理,而新实例不会:

@Bean
public FilterRegistrationBean registerFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(this);
    registration.addUrlPatterns("/secure/*");
    return registration;
}

相关:Spring @Value annotation always evaluating as null?

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2013-12-15
    • 2022-01-21
    • 2021-10-29
    • 2014-05-30
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多