【问题标题】:Unsatisfied dependencies for type [AbstractFacade<Object>] with qualifiers [@Default] at injection point [[BackedAnnotatedField] on GlassFish 4.0在 GlassFish 4.0 上的注入点 [[BackedAnnotatedField] 具有限定符 [@Default] 的类型 [AbstractFacade<Object>] 的不满足依赖性
【发布时间】:2014-04-09 03:04:12
【问题描述】:

当 JSF 托管 bean 扩展抽象控制器时,我得到 Unsatisfied dependencies 异常。我在 AbstractController 中有方法,我想在 PoliceCaseList Bean 中覆盖这些方法。但是,我得到以下例外:我尝试阅读 herehere ,但我的情况似乎不同。

例外

javax.servlet.ServletException: WELD-001408 在注入点 [[BackedAnnotatedField] @Inject private ijmiscrudgen.backing.AbstractController.ejbFacade] 带有限定符 [@Default] 的类型 [AbstractFacade] 的依赖关系不满足

根本原因

org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408 在注入点 [[BackedAnnotatedField] @Inject private ijmiscrudgen.backing.AbstractController.ejbFacade] 带有限定符 [@Default] 的类型 [AbstractFacade] 的依赖关系不满足


@ManagedBean
@ViewScoped
public class PoliceCaseList extends AbstractController<TblCase>{

@Inject
private TblCaseFacade caseFacade;
private TblCasePerson selectedPerson;
private TblCase selected;

@ManagedProperty(value = "#{loginController}")
private LoginController loginController;

/**
 * Creates a new instance of PoliceCaseList
 */
public PoliceCaseList() {
}


这是抽象控制器。这个控制器有我一直想重写的方法。带有 @Named 注释的 Bean 扩展了这个控制器,没有任何抱怨,但是带有 @ManagedBean 注释的 Bean 得到了上述异常。 如何在我的 JSF 托管 Bean 中扩展这个 AbstractController 而不会出现不满意的依赖投诉?

public abstract class AbstractController<T> {

@Inject
private AbstractFacade<T> ejbFacade;
private Class<T> itemClass;
private T selected;
private Collection<T> items;
private boolean trueOrFalse;
private static int idOfSubmittedRecord;

private enum PersistAction {

    CREATE,
    DELETE,
    UPDATE
}

public AbstractController() {
}

【问题讨论】:

    标签: jakarta-ee jsf-2 cdi


    【解决方案1】:

    问题是您混合了两种不同的依赖注入机制:CDI 和 JSF 管理的 bean/properties。这就是@Named bean 起作用的原因:这是一个 CDI 注释,因此它遵循 CDI 规则注入父类。相反,@ManagedBeans 存在于单独的 DI 容器中,即 JSF 容器中,并不关心 CDI 注释。

    这两个世界通过@Named 注释进行通信。因此,我要做的就是制作所有 CDI 并通过 EL 使用 @Named bean,就好像它们是普通的 JSF 托管 bean。这样做的问题是 CDI 不支持 JSF 的视图范围。这可以使用例如解决Deltaspike JSF module

    底线:让一切都成为 CDI。 使用 @Named 而不是 @ManagedBean@Inject 而不是 @ManagedProperty 和 Deltaspike JSF 模块来处理像 @ViewScoped 这样未提供的内容CDI 的开箱即用。

    一些参考

    【讨论】:

    • 如果您使用的是 JSF 2.2,则不需要 Deltaspike。使用 javax.inject.Named 和 javax.faces.view.ViewScoped 注释您的控制器,它将像 ManagedBean 一样工作。
    • 当我为 Scopes 使用正确的 CDI 导入制作所有 CDI 时,它工作正常(JSF 2.2);但还有一个问题。我在 PoliceCaseList Bean 中有一个使用 Injected loginController 的 init 方法,但它无法被调用,异常说。似乎 Injected loginController 在初始化时为空。注入的 bean 在初始化之后还是之前可用?如果我仍然想做一些初始化但使用注入的 loginCONtroller,我该怎么办?
    • “init 方法”是指用@PostConstruct 注释的方法(不是构造函数)或用@Inject 注释的方法(同样不是构造函数)?规则是 @PostConstruct 方法在 @Injections 完成后调用,所以应该使用它。
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2015-06-10
    • 2018-12-19
    • 2015-04-05
    相关资源
    最近更新 更多