jsf - JSF 中基于 CDI 接口(interface)的 bean

标签 jsf jakarta-ee interface jsf-2 cdi

我在 JSF 项目中使用 CDI 时遇到问题。我不能强制 CDI 将 interface-based bean 注入(inject)到 JSF 文件中。

@Named
public class ClassBasedNamedBean {
    public String getMessage() {
        return "Class-based Hello World!";
    }
}

@Named
public interface InterfaceBasedNamedBean {
    public String getMessage();
}

public class InterfaceBasedNamedBeanImpl implements InterfaceBasedNamedBean {
    @Override
    public String getMessage() {
        return "Interface-based Hello World!";
    }
}

我可以在 WebServlet 环境中使用这两个 bean:

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    @Inject
    private ClassBasedNamedBean classBasedNamedBean;

    @Inject
    private InterfaceBasedNamedBean interfaceBasedNamedBean;

    protected void doGet(...) ... {
        PrintWriter pw = response.getWriter();
        pw.println("classBasedNamedBean: " + classBasedNamedBean.getMessage());
        pw.println("interfaceBasedNamedBean: " + interfaceBasedNamedBean.getMessage());

        // Output:
        // classBasedNamedBean: Class-based Hello World!
        // interfaceBasedNamedBean: Interface-based Hello World!
    }
}

但是 interfaceBasedNamedBean 在 JSF 页面中不可用:

<p>ClassBasedNamedBean: #{classBasedNamedBean.message}</p>
<p>InterfaceBasedNamedBean: #{interfaceBasedNamedBean.message}</p>

Output:
<p>ClassBasedNamedBean: Class-based Hello World!</p>
<p>InterfaceBasedNamedBean: </p>

我该如何解决这个问题? JSF 是否需要对 interfaceBasedNamedBean 进行一些显式配置?

最佳答案

作为我最好的猜测:

我不认为规范中提到了这一点,但我很确定 @Named 不打算在接口(interface)上使用。

毕竟,这只是类型和 EL 名称之间的匹配 - 似乎 EL 解析器无法在接口(interface)名称下找到任何(具体的)内容。

因此,尝试注释实现,而不是接口(interface) - 这应该可行。如果您需要灵活处理同一 bean 类型的各种实现 - 将其注入(inject) Controller bean 并使该 bean 可访问。

关于jsf - JSF 中基于 CDI 接口(interface)的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935173/

相关文章:

jsf - 复合组件和ID

jsf - 如何使 JSF 中当前 session 的 View 无效?

java - 为什么要声明一个接口(interface),然后在 Java 中用它实例化一个对象?

java - 关于Java中的接口(interface)和泛型的问题: type mismatch error

jsf - 如何在 JSF 支持 bean 之间共享一个实体?

java - 为什么@PostConstruct 不起作用?

java - 显示ArrayList(EJB session +Servlet+JSP,无JDBC)

web-services - Web 服务 Java EE

java - 抽象类与所有方法抽象和接口(interface)之间的区别?

maven - 是否可以使 JSF FacesServlet 与 AspectJ 一起工作?