首页 > 解决方案 > 无法在 CDI @RequestScoped 托管 Bean 中注入 ExternalContext 或 RequestParam

问题描述

在网上搜索我发现应该可以将一些方便的 JSF 对象@Inject 到 CDI bean 中,这些对象应该由 JSF 生成并通过 javax.faces.annotation.* 中的限定符公开(如 @RequestMap 或 @SessionMap)。

但是,我无法将这些资源@Inject 注入 CDI Bean。即使注入ExternalContextFacesContext失败,如 JSF 2.3-spec 中所述,@Inject 以及以下内容应该是可能的:

@RequestScoped
public class SimpleRequestParamReportProvider implements ReportParamsProvider {
    @Inject // <-- FAILS
    ExternalContext externalContext;

    @Inject // <-- FAILS
    FacesContext facesContext;

    @Inject @RequestMap // <-- FAILS
    Map<String, Object> requestMap;

    @Inject // <-- WORKS
    HttpSession httpSession;

应用程序启动时显示的错误:

在注入点 [BackedAnnotatedField] @Inject report.SimpleRequestParamReportProvider.facesContext 具有限定符 @Default 的类型 FacesContext 的依赖关系不满足

我正在使用符合 JSF 2.3 的JBoss EAP 7.2 https://access.redhat.com/articles/113373

有没有其他人遇到过同样的问题?有什么我想念的吗?

编辑 这是我正在使用的 WEB-INF/faces-config-xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">
</faces-config>

编辑 2:一旦我添加了 @FacesConfig 注释的 java 类,JSF 对象的注入就可以工作:

@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class FacesActivator {}

标签: jbosscdiweldjsf-2.3java-ee-8

解决方案


推荐阅读