简体   繁体   English

Filter中的@Value属性的SpringBoot为null

[英]SpringBoot with @Value property in Filter is null

I'm using SpringBoot's @Value annotation to populate an object property from the default application.properties file, but seeing some strange behaviour in a Filter override. 我正在使用SpringBoot的@Value批注从默认的application.properties文件填充对象属性,但在Filter覆盖中看到一些奇怪的行为。

There are two breakpoints in my debugger: 我的调试器中有两个断点:

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

At 1.: this.client_id is set to 'foo' (from application.properties A2 2.: this.client_id is null 在1: this.client_id设置为'foo'(来自application.properties A2 2: this.client_id为null

Any explanation for the different/missing values? 对不同/缺失值的任何解释?

You're injecting a new BasicFilter() into the FilterRegistrationBean . 您将new BasicFilter()注入FilterRegistrationBean In this case, you're creating a new object, but it won't be a Spring managed bean, so its clientId will be empty. 在这种情况下,您正在创建一个新对象,但它不是Spring托管bean,因此其clientId将为空。 So basically you have 2 instances now: 所以基本上你现在有2个实例:

  1. One created by Spring due to the @Component annotation 由于@Component注释而由Spring创建的
  2. One injected into the FilterRegistrationBean using the new keyword (not managed by Spring) 一个使用new关键字注入FilterRegistrationBean (不由Spring管理)

You should likely move the registerFilter() method to a separate configuration class (annotated with @Configuration) and autowire/inject the BasicFilter bean into that method, eg: 您应该将registerFilter()方法移动到单独的配置类(使用@Configuration)注释@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;
   }
}

Altenatively, if you want to keep the @Bean method in the filter itself, you should replace it by this , since the current object is managed by Spring, while the new instance won't be: Altenatively,如果你想保持@Bean在过滤器本身的方法,你应该取代它this ,因为当前对象由Spring管理,而新的实例不会为:

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

Related: Spring @Value annotation always evaluating as null? 相关: Spring @Value注释总是评估为null?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM