框架中的应用程序特定注入
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>
但消息是一样的!为什么?
既然可以使用@Produces 生成用户,为什么还要使用工厂?
如果您有多个工厂实现,您应该将它们标记为@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;
我想创建一个可重复使用的独立于应用程序的用户注册框架。在数据访问层中,它必须创建特定于应用程序的用户实体。我创建了一个 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>
但消息是一样的!为什么?
既然可以使用@Produces 生成用户,为什么还要使用工厂?
如果您有多个工厂实现,您应该将它们标记为@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;