【问题标题】:CDI decorating a service from another JARCDI 从另一个 JAR 装饰服务
【发布时间】:2019-10-25 02:31:48
【问题描述】:

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

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

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

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

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

如果装饰器仅在提供程序 bean 和装饰器本身的代码在同一个模块中时才起作用,那么我看不到它的用处。 Java EE 装饰器模式有这样的限制吗?还是我做错了什么?

感谢您的见解。

【问题讨论】:

    标签: java jakarta-ee cdi decorator


    【解决方案1】:

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

    根据Oracle's tutorials

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2017-11-16
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2011-12-23
      • 2011-09-03
      相关资源
      最近更新 更多