CDI - 在Wildfly 10上使用EAR中的装饰器的跨EJB使用

时间:2017-08-24 14:38:01

标签: wildfly cdi ear weld jboss-weld

作为结构重构的一部分,我们将应用程序EAR构建技术从自定义的奇怪Ant脚本移动到完整的Maven解决方案。

最终结构曾经是一个包含单个EJB构建的EAR,它通过合并两个EJB;应用程序核心和客户特定的实现,可以定义一些装饰器。

我们想要实现的新结构是一个并排包含两个EJB的EAR。除了拦截器和装饰器之外,这大部分都按预期工作。

特定于客户的实现中,我们定义了如下所示的装饰器:

import javax.annotation.Priority;
import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;
import javax.interceptor.Interceptor;

@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public class ServiceDecorator implements ServiceInterface {

    @Inject
    @Delegate
    ServiceBean delegate;

在Wildfly 10.1上启动后,Weld(2.3.5-Final,Wildfly附带)报告装饰器确实已启用,但它似乎永远无法将装饰器绑定到驻留在核心中的服务实施。

DEBUG [org.jboss.weld.Bootstrap] (MSC service thread 1-6) WELD-000104: Enabled decorator types for Weld BeanManager for /opt/wildfly/standalone/deployments/app.ear/core.jar [bean count=2]: 
  - class ServiceDecorator
[...]
DEBUG [org.jboss.weld.Bootstrap] (MSC service thread 1-6) WELD-000108: Decorator: Decorator [class ServiceDecorator] decorates [Service] with delegate type [ServiceBean] and delegate qualifiers [@Default]

我们甚至跟踪了Weld核心中的代码,我们确实看到装饰器全局启用()但从未绑定到服务,因为核心实现bean管理器不会看到装饰器bean。

我们还尝试在常规 lib jar中移动装饰器并获得相同的结果。还试图使用拦截器以及使用@Specialize注释,但都无济于事......

因此,总之,有没有办法在EJB中定义装饰器或拦截器,以增强位于另一个EJB中的服务的行为,当两者都包含在同一个EAR中时?

0 个答案:

没有答案