Spring boot 1.5.1 - 内部注册的过滤器无法访问 Spring 上下文 @Value [英] Spring boot 1.5.1 - Inside registered Filter can not access Spring context @Value

查看:67
本文介绍了Spring boot 1.5.1 - 内部注册的过滤器无法访问 Spring 上下文 @Value的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法读取以下属性值,因为我可以在其他控制器中读取相同的值,但不能在提供的过滤器中读取

I could not read the below properties value, where as I can read the same value in to my other controllers But not in the furnished Filter

@Value("${session.timout.mins}")
    private String sessionTimeout;

我的过滤器

@Configuration
public class AuthoriseFilter implements Filter {

    Logger logger = Logger.getLogger(AuthoriseFilter.class);

    private static String ADMIN_LOGIN_EMIAL = "sdsds@mail.com";
    private static String ISSUER_LOGIN_EMIAL = "dsds@mail.com";

    @Value("${session.timout.mins}")
    private String sessionTimeout;

这是在 Spring 上下文中注册过滤器的方式

package com.digrec.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.digrec.filter.AuthenticateFilter;
import com.digrec.filter.AuthoriseFilter;

@Configuration
public class FilterConfig {

     @Bean
        public FilterRegistrationBean authoriseFilterRegistrationBean() {
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();
            String[] patterns = new String[]{"/login", "/logout"};
            registrationBean.setName("authFilter");
            AuthoriseFilter authFilter = new AuthoriseFilter();
            registrationBean.setFilter(authFilter);
            registrationBean.addUrlPatterns(patterns);
            registrationBean.setOrder(1);
            return registrationBean;
        }

     @Bean
        public FilterRegistrationBean authenticateFilterRegistrationBean() {
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();
            String[] patterns = new String[]{"/api/*", "/adminapi/*"};
            registrationBean.setName("authenticateFilter");
            AuthenticateFilter authFilter = new AuthenticateFilter();
            registrationBean.setFilter(authFilter);
            registrationBean.addUrlPatterns(patterns);
            registrationBean.setOrder(1);
            return registrationBean;
        }

}

推荐答案

问题出在 FilterConfig.class 中,您是通过调用构造函数自己创建过滤器实例的.这应该使用 spring 管理的 bean 来完成,如下所示.我只为 AuthoriseFilter 展示,同样也应该为 AuthenticationFilter 做.

The problem is in your FilterConfig.class you are creating the filter instances yourself by calling constructor. This should be done using spring managed bean like below. I'm showing only for AuthoriseFilter, similar should be done for AuthenticationFilter also.

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean authoriseFilterRegistrationBean(@Autowired AuthoriseFilter authFilter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        String[] patterns = new String[]{"/", "/list"};
        registrationBean.setName("authFilter");
        registrationBean.setFilter(authFilter);
        registrationBean.addUrlPatterns(patterns);
        registrationBean.setOrder(1);
        return registrationBean;
    }
}

并且您的过滤器不是配置,因此应使用@Component 进行注释

And your filter isn't configuration so it should be annotated with @Component

@Component
public class AuthoriseFilter implements Filter {

    Logger logger = Logger.getLogger(AuthoriseFilter.class);

    private static String ADMIN_LOGIN_EMIAL = "sdsds@mail.com";
    private static String ISSUER_LOGIN_EMIAL = "dsds@mail.com";

    @Value("${session.timout.mins}")
    private String sessionTimeout;
}

这篇关于Spring boot 1.5.1 - 内部注册的过滤器无法访问 Spring 上下文 @Value的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆