【问题标题】:CDI Observer condition in @Dependent bean@Dependent bean 中的 CDI 观察者条件
【发布时间】:2018-07-31 20:28:48
【问题描述】:

我有一个抽象超类:

public abstract class A<T extends Other> extends B {...}

@ViewScoped@Named 定义的另一个类正在扩展A:

public class C extends A<OtherSub> implements Serializable {...}

到目前为止,这没有问题。

现在我想在超类 A 中添加观察者方法来通用处理 CDI 事件,例如:

public void entityCreated(@Observes(notifyObserver = Reception.IF_EXISTS) @Created EntityChangedEvent event) {...}

但是部署这个wildfly会在部署过程中抛出异常:

WELD-000404:条件观察者方法不能由 @Dependent 范围 bean 声明:[BackedAnnotatedMethod] public A.entityCreated(@Observes @Created EntityChangedEvent)

我知道我可以在没有 notifyObserver 条件的情况下创建观察者,但这会产生其他 bean 将被创建并在 CDI 事件时通知的效果,我想阻止这种情况。

有没有办法在泛型超类中使用notifyObserver 条件?或者我是否需要在没有该条件的情况下分别在具体子类中实现它?

【问题讨论】:

    标签: java cdi


    【解决方案1】:

    只看 CDI 1.2 规范,section 10.4.4 Conditional observer methods

    @Dependent 范围的 Bean 可能没有条件观察者方法。

    因此,您的请求在这方面是无效的,它不能工作。我可以看一眼的原因之一是@Dependent bean 不是正常范围的,基本上可以存在“在给定的上下文中”(注意引号)0 -n 次。因此,您在通知中会有一些歧义。相比之下,普通的作用域 bean 在给定的上下文中会存在 0-1 次,所以在那里非常简单。

    因此,对于 @Dependent bean,您必须坚持使用非条件观察者方法。

    【讨论】:

    • 但是实现类(在示例中为C)具有正常范围,因此符合规范。我眼中的问题是我无法在抽象超类A 上定义范围,这导致了问题。
    • @GeorgHenkel 抱歉,我错过了 CViewScoped 的事实。在这种情况下,它确实应该可以工作,我只是尝试了C 是普通作用域 bean 的虚拟 CDI SE 应用程序,它工作得很好。你能确定它是javax.faces.view.ViewScoped(并且不是 javax.faces.bean)吗?
    • 感谢您的测试。我还重新检查了我的设置,发现A 的其他子类没有定义范围(由也在该项目工作的同事创建)。这些是导致错误的原因,而不是我正在观看的课程。
    • 有道理,很高兴你把它钉牢了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2016-05-24
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多