CDI从另一个罐子装饰服务

2022-04-13 00:00:00 decorator jakarta-ee java cdi

我想使用CDI的Decorator模式来增强服务提供的业务逻辑。我试图修饰的服务位于另一个模块中(用maven术语来说),因此是另一个JAR。例如,提供的服务在模块com.acme.provider中,而装饰符在com.acme.consumer中,紧挨着服务使用者。

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

装饰符在使用者模块内的beans.xml中声明。

我提供了一个工作示例here。在mvn install上,测试打印"Hello",而不是应用修饰符时的"Hello World"。

如果我将修饰符(及其XML声明)移动到Providers模块(请参阅同一存储库的分支decorator-in-provider),则一切正常,并打印出"Hello World"。

如果装饰器只有在提供者Bean和装饰器本身的代码都在同一模块中时才能工作,我认为它几乎没有什么用处。对Java EE装饰器模式有这样的限制吗?还是我做错了什么?

感谢您的真知灼见。


解决方案

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

根据Oracle's tutorials:

您在beans.xml文件中指定的修饰符仅适用于 类在同一存档中。使用@PRIORITY注释指定 应用程序的全局修饰符,该应用程序由 模块。

@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public abstract class CoderDecorator implements Coder { ... }

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

相关文章