Cdi 应用程序范围的托管bean未初始化

Cdi 应用程序范围的托管bean未初始化,cdi,servlet-filters,Cdi,Servlet Filters,我有一个应用程序范围的托管bean,我正试图将它注入到会话过滤器中,以根据应用程序范围bean提供的映射过滤规则 应用程序范围bean的目的是将应用程序配置从数据库加载到映射中,该映射可以在应用程序范围内访问 @Named @ApplicationScoped public class ApplicationConfig implements Serializable { private Map<String,String> accessRule; privat

我有一个应用程序范围的托管bean,我正试图将它注入到会话过滤器中,以根据应用程序范围bean提供的映射过滤规则

应用程序范围bean的目的是将应用程序配置从数据库加载到映射中,该映射可以在应用程序范围内访问

@Named
@ApplicationScoped
public class ApplicationConfig implements Serializable {

    private  Map<String,String> accessRule;

    private static final long serialVersionUID = -7984677603595580195L;

    @PostConstruct
    public void init() throws SQLException, Exception {
        System.out.println("ApplicationContainer INIT");

        accessRule.put("A", "A");
    }

    public Map<String,String> getAccessRule() {
        return accessRule;
    }

    public void setAccessRule(Map<String,String> accessRule) {
        this.accessRule = accessRule;
    }
}
@Named
@适用范围
公共类应用程序配置实现可序列化{
私有映射访问规则;
私有静态最终长serialVersionUID=-7984677603595580195L;
@施工后
public void init()引发SQLException,异常{
System.out.println(“ApplicationContainer INIT”);
accessRule.put(“A”、“A”);
}
公共映射getAccessRule(){
返回访问规则;
}
public void setAccessRule(映射访问规则){
this.accessRule=accessRule;
}
}
我尝试过@PostConstruct,也尝试过使用构造函数,但是没有调用bean。这就是注入命名bean的方式

@WebFilter(urlPatterns = { "/*" })
public class ApplicationFilter implements Filter {

    private static final String FACES_RESOURCES = "javax.faces.resource";

    private static final Logger log = Logger.getLogger(ApplicationFilter.class.getName());

    private boolean disableFilter;

    private String errorPage;

    private String indexPage;

    @Inject
    public ApplicationConfig applicationConfig;

    private List<String> ignoredResources = new ArrayList<>();

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
        System.out.println(applicationConfig.getAccessRule());
        arg2.doFilter(arg0, arg1);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}
@WebFilter(urlPatterns={”/*“})
公共类ApplicationFilter实现过滤器{
私有静态最终字符串FACES\u RESOURCES=“javax.FACES.resource”;
私有静态最终记录器log=Logger.getLogger(ApplicationFilter.class.getName());
私有布尔禁用过滤器;
私有字符串错误页;
私有字符串索引扩展;
@注入
公共应用程序配置应用程序配置;
private List ignoredResources=new ArrayList();
@凌驾
公共空间销毁(){
//TODO自动生成的方法存根
}
@凌驾
public void doFilter(ServletRequest arg0、ServletResponse arg1、FilterChain arg2)引发IOException、ServletException{
System.out.println(applicationConfig.getAccessRule());
arg2.doFilter(arg0,arg1);
}
@凌驾
public void init(FilterConfig arg0)抛出ServletException{
}
}

我使用了@Named/@Inject,但仍然不起作用。我想使用一个应用程序范围的bean,它从DB获取详细信息,并在WebFilter中使用它。请帮助

@balusc按照您在另一篇文章中提出的建议,更新我的代码ApplicationConfig=(ApplicationConfig)arg0.getServletContext().getAttribute(“ApplicationConfig”);System.out.println(config.getAccessRule());我得到了空指针again@BalusC完成,但仍然获取空值注入私有应用程序配置@巴卢斯克。我使用了命名/注入,但仍然不起作用。我想使用一个应用程序范围的bean,它从DB获取详细信息,并在WebFilter中使用它。好心的help@BalusC我正在使用tomcat作为服务器检查这个@balusc根据您在另一篇文章中提出的建议,我更新了代码ApplicationConfig=(ApplicationConfig)arg0.getServletContext().getAttribute(“ApplicationConfig”);System.out.println(config.getAccessRule());我得到了空指针again@BalusC完成,但仍然获取空值注入私有应用程序配置@巴卢斯克。我使用了命名/注入,但仍然不起作用。我想使用一个应用程序范围的bean,它从DB获取详细信息,并在WebFilter中使用它。好心的help@BalusC我正在使用tomcat作为服务器检查这个?