框架中的应用程序特定注入

Application specific injection in a framework

我想创建一个可重复使用的独立于应用程序的用户注册框架。在数据访问层中,它必须创建特定于应用程序的用户实体。我创建了一个 UserFactory 接口来注入特定于应用程序的工厂实例。

public interface UserFactory
{
  public UserWithRoles createUser();
}

@Dependent
class UserWithRolesDAL
{
  @Inject
  private UserFactory userFactory;
  ...
}

NetBeans 说:"Unsatisfied dependency:no beans matches the injection point" 我知道我应该使用限定符。但在这种情况下,它不会是一个独立于应用程序的框架。如何使用依赖于应用程序配置的 UserFactory 实现?

语言是Java。它发生在 WabApp 的 EJB 模块中。 UserWithRolesDAL 本身由 CDI 注入到无状态会话 bean 中。

按照高额桌的建议,我做到了:

@Alternatives
@ApplicationScoped
class XUserFactory implements UserFactory
{
  ...
}

并在 beans.xml 中注册:

<alternatives>
    <class>x.XUserFactory</class>
</alternatives>

但消息是一样的!为什么?

  1. 既然可以使用@Produces 生成用户,为什么还要使用工厂?

  2. 如果您有多个工厂实现,您应该将它们标记为@Alternative,并且在每个应用程序的 beans.xml 中,您可以指定使用的实现: https://docs.oracle.com/javaee/6/tutorial/doc/gjsdf.html

编辑:一方面,如果您将所有这些应用程序完全独立于 EAR 之外,我认为 CDI 不支持交叉部署注入,所以这也可能是问题所在

好的。 beans.xml中bean备选注册后错误包@ApplicationScoped注解引起的错误

错误的:

import javax.faces.bean.ApplicationScoped;

正确的:

import javax.enterprise.context.ApplicationScoped;