powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / CDI в JBoss 7.1.1
21 сообщений из 21, страница 1 из 1
CDI в JBoss 7.1.1
    #38984169
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вопрос по работе с CDI в нескольких WAR модулях одного EAR приложения.
Был написан WAR модуль с CDI объектами. Назрела необходимость разбить один WAR на два отдельных WAR модуля.
Первый работает по HTTP, второй по HTTPS. Context-root разные.
В обоих WAR модулях наборы классов одинаковые. JBoss ругается

Код: plaintext
1.
2.
3.
WELD-001409 Ambiguous dependencies for type [WebManager] with qualifiers [@Default] at injection point [[field] @
Inject app.MyServlet.webManager]. Possible dependencies [[Managed Bean [class app.WebManagerImpl] with qualifiers
 [@Any @Default], Managed Bean [class app.WebManagerImpl] with qualifiers [@Any @Default]]]

Оставляю только один WAR модуль, ошибка исчезает.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38985289
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
gals,

Вынести все одинаковые бины в отдельный EJB JAR, его использовать в обоих WAR. JBoss как бы намекает - нехорошо копипастить :)

Если не секрет - зачем было так делать?
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38985907
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WGA, извините, не совсем понял. При чем здесь EJB бины? Они и так вынесены в ejb jar контейнеры.
CDI должен работать в рамках одного WAR.
Я же говорю о том, что в EAR приложении существует два WAR модуля. Архитектура, естественно, одна и та же. По этой причине, базовые компоненты будут одинаковыми. Например, регистрация сертификата для авторизации.
Один модуль работает, когда пользователь входит в открытую часть системы и хочет пройти процедуру первичной регистрации. Второй модуль - закрытая часть системы, для авторизованных пользователей.
При первичной регистрации надо указать сертификат, которым будет проверяться авторизация.
В личном кабинете можно сменить сертификат, так как в сертификате есть срок действия и он иногда заканчивается.

Логично, что процедура обработки веб запросов находится в WAR модуле, а обработка полученных данных в EJB модулях. Так зачем же выносить обработку WEB (ajax) запроса в EJB? И как это делать, минуя servlet или JAX-RS?

Повторюсь еще раз CDI работает в рамках одного WAR модуля. Получается, что реализация Weld в JBoss противоречит спецификации самого Weld.
Либо, я ничего не понимаю.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986416
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
galsWGA, извините, не совсем понял. При чем здесь EJB бины? Они и так вынесены в ejb jar контейнеры.
CDI должен работать в рамках одного WAR.Вообще должен, но всякое случается... ( Правда, где Вы нашли в стандарте именно такие места - не понимаю...galsЯ же говорю о том, что в EAR приложении существует два WAR модуля. Архитектура, естественно, одна и та же. По этой причине, базовые компоненты будут одинаковыми. Например, регистрация сертификата для авторизации.Если проект сложный, то поймать 2 либы с одинаковыми бинами в качестве injection target - дело нехитрое. Другое дело, что по у вас WAR по бинам пересекаются в чем очень сомневаюсь. Скорее всего что-то другое...
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986467
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WGA,
У нас есть два WAR модуля. В каждом есть набор своих CDI объектов.
Как нам любят показывать, есть компоненты обработки для разных валют или кредитных карт.
Что нам нужно, в CDI, чтобы получить объект нужной реализации? Правильно, добавить свою аннотацию.
В аннотации можно указать параметр value.

Как по содержимому объекта найти нужную реализацию?
Скажем, указан псевдоним валюты "RUR" или "USD".
Мы используем специальный объект для поиска:

Код: java
1.
@Inject @Any Instance<Currency> instance;



И пишем такую хитрую штуку:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class CurrencyLiteral extends AnnotationLiteral<Currency> implements Currency {

	private String value;

	public WebObjectDefineLiteral(String value) { this.value = value; }

	@Override
	public String value() { return value; }
}


Теперь мы можем найти нужную нам реализацию:

Код: java
1.
Instance<Currency> selectInstance = instance.select(new CurrencyLiteral("RUR"));



Если в каждом WAR модуле есть свой набор реализаций, то объекты первого модуля видны во втором?
Ну, это как-то глупо выглядит.

Уж лучше сразу ставить крест на EJB и переходить на OSGi. Там хотя бы PAX-CDI однозначно утверждает, что CDI работает только в переделах одного OSGi bundle.

Ведь это реальная дыра в безопасности всего проекта. Со стороны клиента может прийти ajax запрос, который не должен обработаться в рамках первого WAR модуля, но успешно обрабатывается во втором WAR модуле.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986474
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galsПовторюсь еще раз CDI работает в рамках одного WAR модуля. Получается, что реализация Weld в JBoss противоречит спецификации самого Weld.
Либо, я ничего не понимаю.
Это немного странно, потому-что ear, вроде как, является цельным модулем, соответственно CDI должен быть один на весь ear. Оно так и есть, и из-за этого и происходит ошибка. Надо только разобраться почему каждый war создаёт свой экземпляр бина. Возможно он как-то связан с контекстом?
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986488
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох уж этот форум. Редактировать нельзя, добавить еще, то же нельзя. В примере неправильно написал название конструктора.

Вот и получается, что есть набор одинаковых CDI объектов в каждом WAR модуле. И Weld начинает ругаться.
Выносить общие CDI объекты в оnдельный JAR модуль, то же глупо. Ведь это не решает проблемы видимости чужих CDI объектов.
Если бы чужие CDI объекты были не видимы, тогда изначального конфликта не было бы.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986605
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gals,
https://issues.jboss.org/browse/WELD-1065
Выход есть - использовать WildFly, там 2.0.0.Alpha4
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986611
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
даже не альфа, а 2.1 в wildfly 8.1 (а уже есть и 8.2)
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986624
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanragals,
https://issues.jboss.org/browse/WELD-1065
Выход есть - использовать WildFly, там 2.0.0.Alpha4
Так и думал что не должно быть там разных экземпляров. Модуль-то один.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986645
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного не так, cdi бины должны повторять принципы видимости классов. Разные загрузчики - разные классы и разные бины.
Таким образом, наличие одноименных бинов в разных war - не криминал, даже если они принадлежат одному ear, но в weld 1.1.5, который в jboss 7.1.1, проверка уникальности работает неправильно
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986653
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraТаким образом, наличие одноименных бинов в разных war - не криминал, даже если они принадлежат одному ear, но в weld 1.1.5, который в jboss 7.1.1, проверка уникальности работает неправильно
Криминал, потому-что один ear это по-умолчанию один загрузчик.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986688
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У war модулей внутри ear собственные загрузчики, для других модулей настраивается (по умолчанию - модули не изолированы)
https://docs.jboss.org/author/display/AS7/Class Loading in AS7
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986710
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraУ war модулей внутри ear собственные загрузчики, для других модулей настраивается (по умолчанию - модули не изолированы)
https://docs.jboss.org/author/display/AS7/Class Loading in AS7
Хороший пример того что JEE это какой-то адовый ад.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986802
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraУ war модулей внутри ear собственные загрузчики, для других модулей настраивается (по умолчанию - модули не изолированы)
https://docs.jboss.org/author/display/AS7/Class Loading in AS7

Легче разобраться с правилами в OSGi, из десятка страницах, нежели в одном предложении от JBoss.

Чем отличается спецификация OSGi и JavaEE. В OSGi пишут спецификацию, потом реализацию. В JavaEE сначала реализацию, потом спецификацию и уже после латают реализацию.

Если честно, я всегда считал, что у каждого WAR модуля обязан быть собственный загрузчик классов. Иначе, все web ресурсы создали кашу. А раз так, то и CDI должен был работать корректно, в рамках своего ClassLoader.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38986874
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gals,
тут дело не спецификации, а в том, что в jboss 7 баг - реализация cdi не соответствует спецификации https://issues.jboss.org/browse/WELD-1065
Можно попробовать задеплоить приложение с weld 2, где баг исправлен, но лучше просто взять сервер поновее - wildfly.
Мне кажется, это "наведенная" ошибка из-за того, что была путаница с @ApplicationScoped, так как вдруг выяснилось, что для EAR недостаёт @EARApplicationScoped либо @WARApplicationScoped
А с загрузчиками классов никаких новостей - в jboss war-модули в enterprise-приложениях имеют собственные загрузчики, по крайней мере, с jboss4
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38987053
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
BlazkowiczivanraУ war модулей внутри ear собственные загрузчики, для других модулей настраивается (по умолчанию - модули не изолированы)
https://docs.jboss.org/author/display/AS7/Class Loading in AS7
Хороший пример того что JEE это какой-то адовый ад.Класслоадинг в java вообще занимательная штука ))) В томкате тоже можно намутить так, что не горюй...
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38987837
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,
Ну да, замечательно. Берем WildFly 8.2 и радуемся другим ошибкам. Раньше, я замечательно пользовался
Код: java
1.
2.
InitialContext ctx = new InitialContext();
UserTransaction tx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");


Теперь, я радостно ловлю JBAS014237. https://issues.jboss.org/browse/WFLY-1168

Ведь не все объекты в EAR приложении являются EJB CMT объектами. Некоторые, по старинке, создаются через старый, добрый new.
И каким, таким способом, созданный объект осчастливить разрешением аннотаций @EJB, @Resource, @TransactionAttribute?

JPA, это вообще, лебединая песня о транзакциях. Не поймешь, когда нужно начинать транзакцию от Hibernate Session (EntityManager) и руками ставить commit, а когда эта сессия работает в рамках JTA транзакции. Ведь мы познакомились с JBAS014237 от WildFly.
И не дай бог, случайно сделать
Код: java
1.
2.
Transaction transaction;
transaction.commit();


Да, и совсем уж в пику JavaEE 7.
Есть @Transactional и @TransactionAttribute. Есть @Inject и @EJB/@Resource.
@TransactionAttribute и @EJB/@Resource, вообще, надо запретить к использованию и предать анафеме в JavaEE API.

В общем виде, спецификация JavaEE нервно курит в сторонке, пока усиленно правятся ошибки в JavaEE серверах.
А относительно недавняя эпопея с изменением имен в lookup с JavaEE 2 на JavaEE 3 от JBoss 7, вам понравилась?
Это то же, спецификация JavaEE была в отпуске?


По поводу Weld CDI я скажу крамольную штуку. Ей не хватает много-модульности и приватных модулей из Guice.
Если бы ребята взяли этот функционал, не было бы проблем с областями видимости объектов в разных JAR/WAR/EJB модулях. Всё бы ограничивалось кругом конкретного модуля.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38987934
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galsЕсть вопрос по работе с CDI в нескольких WAR модулях одного EAR приложения.
Был написан WAR модуль с CDI объектами. Назрела необходимость разбить один WAR на два отдельных WAR модуля.
Первый работает по HTTP, второй по HTTPS. Context-root разные.
В обоих WAR модулях наборы классов одинаковые. JBoss ругается

Код: plaintext
1.
2.
3.
WELD-001409 Ambiguous dependencies for type [WebManager] with qualifiers [@Default] at injection point [[field] @
Inject app.MyServlet.webManager]. Possible dependencies [[Managed Bean [class app.WebManagerImpl] with qualifiers
 [@Any @Default], Managed Bean [class app.WebManagerImpl] with qualifiers [@Any @Default]]]

Оставляю только один WAR модуль, ошибка исчезает.

Может перед jboss serverом поставить прокси (например апач) -и разворачивать ваш https на нем
а, уже в jboss ходить одинаково по http , передавая инфу в заголовках ?
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #38987975
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1Может перед jboss serverом поставить прокси (например апач) -и разворачивать ваш https на нем
а, уже в jboss ходить одинаково по http , передавая инфу в заголовках ?
Увы, это не выход из сложившейся ситуации. Легче тогда поднять два независимых EAR модуля на одном JBoss. Либо, потратить время на адаптацию кода под новые специфики WildFly 8.2.
...
Рейтинг: 0 / 0
CDI в JBoss 7.1.1
    #39043262
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
Наткнулся тут случайно. Ear sybdeployments isolated - по умолчанию false.
Кому-нибудь поможет...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / CDI в JBoss 7.1.1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]