Я поддерживаю приложение с несколькими арендаторами, в котором специальные метаданные по запросам (заголовки, параметры) идентифицируют конкретных арендаторов. Каждый арендатор имеет пользовательские конфигурации в системе, которые переопределяют некоторые значения по умолчанию. Конфигурации исходят из базы данных, дополненной кэшем, с помощью EJB. Чтобы успешно найти одну такую настраиваемую конфигурацию, необходим ключ и идентификатор арендатора. Если идентификатор арендатора отсутствует, ключ используется только для получения значения по умолчанию для ввода ключа.Передача данных Runtime (Meta) в метод производителя в CDI
От удаленных интерфейсов, которые получают эти запросы (сервлеты, веб-сервисы и т. Д.). Я хочу получить такие идентификаторы и контексты настройки (например, поместить свойства в EJBContext
), чтобы методы производителей могли использовать для настройки соответствующих компонентов для обслуживания клиентов каждого арендатора. В идеале я хотел бы также рекомендовать CDI над EJB для этого случая настолько же разумно.
Я думал о линиях следующей стратегии, но я застрял.
- Создайте квалификатор
@Config
, чтобы контейнер CDI разрешался производителю конфигурации. - Создайте аннотацию конфигурации
@Key(String)
, через которую можно получить ключ поиска желаемой записи конфигурации. - Создайте метод производителя, который принимает параметр
InjectionPoint
.InjectionPoint
позволяет получить аннотацию@Key
, объявленный тип целевого поля и класс, в котором объявлено это введенное поле (охватывающий класс). Слабый сценарий был бы, еслиInjectionPoint
позволяет мне получить экземпляр входящего класса. Но, думая об этом, это не имеет смысла, поскольку экземпляр еще не готов, пока все его зависимости не будут созданы/расположены и не введены.
В этом случае CDI не предназначен для? Как это лучше всего реализовать?
Спасибо за замечательный ответ! В методе 'productionConfigEntry' вы разыменовали' ThreadLocal'. Вы имели в виду 'ThreadLocalHolder'? Как это делается в классе «Продюсер»? 'TransactionSynchronizationRegistry', я думаю, будет подталкивать меня к EJB для транзакций. Можно ли пройти этот маршрут с чистым CDI? Между тем, я буду играть с вашей предлагаемой стратегией и сообщать о своих выводах. Спасибо заранее! –
Да, вы правы, должен был быть 'ThreadLocalHolder'. Именно этот статический перенос по контексту потока позволяет обмениваться контекстом между всеми компонентами, выполняемыми в одном потоке. Транзакции не ограничиваются контекстом EJB, поэтому в теории нет ничего, что помешало бы вам использовать его в чистом CDI. Возможно, здесь может быть отсутствие транзакции в веб-слое. Если ваш сервер поддерживает его, вы также можете вставить @RequestScoped beans в yoir EJB. Таким образом, вы можете использовать CDI в качестве держателя данных – yntelectual
Если мне не гарантировано, что мои поддерживающие бизнес-компоненты (EJB/CDI beans) будут выполняться в том же потоке, что и обслуживаемые удаленные интерфейсы (сервлеты, jax-ws/rs) , то мне, вероятно, лучше подойдет подход TransactionSynchonizationRegistry. –