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
以正确的方式解决了问题。
相关文章