CDI 装饰另一个 JAR 中的服务

Ahm*_*wan 2 java decorator cdi jakarta-ee

我想使用 CDI 的装饰器模式来增强服务提供的业务逻辑。我尝试装饰的服务位于另一个模块(用 Maven 术语来说),因此是另一个 JAR。例如,提供的服务位于模块中com.acme.provider,而装饰器位于com.acme.consumer服务消费者旁边。

我的服务按原样注入,没有任何修饰。

beans.xml装饰器在消费者模块内部声明。

我在这里提供了一个工作示例。在 上mvn install,测试打印“Hello”而不是“Hello World”,因为它会应用装饰器。

如果我将装饰器(及其 xml 声明)移至提供者模块(请参阅decorator-in-provider同一存储库的分支),则一切正常并打印“Hello World”。

如果装饰器仅在提供者 bean 和装饰器本身的代码位于同一模块中时才起作用,那么我认为它的用处不大。Java EE 装饰器模式有这样的限制吗?或者我做错了什么?

感谢您的见解。

Ahm*_*wan 5

好的,将我的问题形式化帮助我找到了答案。

根据Oracle 的教程

您在 beans.xml 文件中指定的装饰器仅适用于同一存档中的类。使用@Priority注释为由多个模块组成的应用程序全局指定装饰器。

@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public abstract class CoderDecorator implements Coder { ... }
Run Code Online (Sandbox Code Playgroud)

我的工作示例存储库中的分支solution以正确的方式解决了问题。