【问题标题】:@Asynchronous private method in EJBEJB 中的 @Asynchronous 私有方法
【发布时间】:2010-09-28 17:39:16
【问题描述】:

我的 EJB 单例中有一个异步方法,该方法是从同一类中的另一个方法调用的。我已经知道我不能直接调用异步方法,我必须获得一个EJB代理。问题是,我不希望异步方法在类外可见;但是当我将其设为私有时,它不会异步执行。 (我使用的是 Glassfish v3。)

The javadocs 不要说所需的访问级别。那么这是否应该被视为 Glassfish 中的错误?

【问题讨论】:

    标签: java jakarta-ee glassfish ejb ejb-3.1


    【解决方案1】:

    方法注解不能用于私有方法。当 Glassfish 编译您的 EJB 时,它基本上会将您的注释转换为一段代码,该代码将在代理中围绕您的代码。如果您的方法是私有的,它将绕过创建的代理 Glassfish... 因此,在您的情况下,我建议使用您的异步方法创建一个新的 EJB,并将其注入您当前的 EJB

    【讨论】:

    • 好的,但是为什么?你是说代理对象只有公共方法的代理。这实际上是 Java EE 规范所要求的,还是只是 Glassfish 的实现细节?
    • 它只是一个 Glassfish 实现,但看一下 Javadoc 说的“用于将方法标记为异步方法或将类或接口的所有业务方法指定为异步。”业务方法是可以被其他人使用的方法。私有方法不进来。
    • EE 规范要求只能使用公共方法。否则容器将无法为私有方法创建代理,除非 AOP/编织。您尝试调用私有方法这一事实意味着您没有正确调用业务方法,您只是在调用本地方法。
    【解决方案2】:

    这是一个非常有趣的反馈。我可以看到您尝试做的事情的价值。尝试将您的 bean 标记为 @LocalBean 并将您的 @Asynchronous 方法注释为 protected

    由于@LocalBean 支持基本上是通过子类化bean 类(动态或静态)完成的,因此容器实际上不可能覆盖private 方法。但我当然可以看到你的用例。如果protected 方法方法不起作用,我们可能可以将其添加为对 EJB.next 的增强。

    仍然可以访问同一个包中的其他 bean,但它至少不那么公开。我经常希望 Java 有一个“唯一的子类”范围。我几乎从未使用过protected,然后想,“太好了,现在我包中的每个人都可以访问它了。”

    【讨论】:

    • 将其标记为受保护并不能真正实现我想要的,但感谢您的建议。这对于 EJB 的下一个版本可能是一个很好的补充;如果做不到这一点,如果文档简单地解释这种事情不起作用,那就太好了。我同意“仅子类范围”的想法。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2017-10-22
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多