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 装饰器模式有这样的限制吗?或者我做错了什么?
感谢您的见解。
好的,将我的问题形式化帮助我找到了答案。
根据Oracle 的教程:
您在 beans.xml 文件中指定的装饰器仅适用于同一存档中的类。使用@Priority注释为由多个模块组成的应用程序全局指定装饰器。
@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public abstract class CoderDecorator implements Coder { ... }
Run Code Online (Sandbox Code Playgroud)
我的工作示例存储库中的分支solution以正确的方式解决了问题。