CDI, украшающий сервис из другого JAR - PullRequest
0 голосов
/ 10 июня 2019

Я хочу использовать шаблон Decorator CDI для расширения бизнес-логики, предоставляемой сервисом. Служба, которую я пытаюсь оформить, находится в другом модуле (в терминах maven), то есть в другом JAR. Например, предоставляемый сервис находится в модуле com.acme.provider, а декоратор - в com.acme.consumer рядом с потребителем сервиса.

Мой сервис вводится как есть, без оформления.

Декоратор объявлен в beans.xml внутри потребительского модуля.

Я приведу рабочий пример здесь . После mvn install тестовые распечатки "Hello", а не "Hello World", как если бы был применен декоратор.

Если я перенесу декоратор (и его объявление xml) в модуль провайдеров (см. Ветку decorator-in-provider того же репозитория), все будет работать нормально, и будет напечатан «Hello World».

Если декораторы работают только тогда, когда код как компонента поставщика, так и самого декоратора находится в одном и том же модуле, я вижу, что он мало используется. Есть ли такое ограничение для шаблона декоратора Java EE? Или я что-то не так делаю?

Спасибо за понимание.

1 Ответ

1 голос
/ 10 июня 2019

Хорошо, формализация моего вопроса помогла мне найти ответ.

Согласно Руководствам по Oracle :

Декораторы, которые вы указываете в beans.xmlФайл применяется только к классам в одном архиве.Используйте аннотацию @Priority, чтобы глобально указывать декораторы для приложения, состоящего из нескольких модулей.

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

Ветвь solution в моем рабочем репозитории примера решает проблему правильным способом.

...