У меня возникают проблемы при развертывании приложения Java EE и вы можете использовать некоторые советы.
У меня 3 компонентов для развертывания:Проблема развертывания Java EE
- интеграции слой (данные): POJOs и CDI Beans - JAR-файл
- прикладного уровня (BL): EJBs, CDI Фасоль и POJOs - JAR-файл
- презентации слой: сервлеты и такое - файл WAR
Оптимально, я хотел бы иметь возможность развернуть оба интеграции и прикладного уровня JARs в том же сервере Java EE, но как отдельные файлы JAR (так как я мог бы изменить конфигурации оборудования позже и разделить их на два разных сервера на двух отдельных машинах).
Проблема заключается в том, что я не могу получить инъекцию CDI из JAR уровня интеграции в JAR прикладного уровня для работы. Сервер говорит (и, вероятно, справедливо), что невозможно разрешить инъекции.
До сих пор я придумал эти возможные решения:
- Пакет два JAR-файлы в один файл EAR (может быть, бросить в WAR, а также ...), и развернуть этот
- Используйте JNDI между различными слоями (возможно, создать CDI-производителя для создания общей инъекции на основе JNDI-имен или что-то в этом роде)
- На уровне интеграции сделайте объекты, которые вводятся в EJB прикладного уровня (DAO) вместо CDI-компонентов
Мне не нравятся ни одно из этих решений (особенно последнее), поскольку они ограничивают мои будущие варианты развертывания. Второе решение не ограничивает меня, но в какой-то момент оно может стать утомительным (когда я накапливаю много кода).
Наконец, мой вопрос:
Есть ли вариант я еще не нашел, что позволило бы мне развернуть два JARs на одном сервере с инъекцией CDI работает? Возможно, что-то еще будет работать, если в какой-то момент я отделяю JAR на разные серверы?
Я развертываю сервер TomEE, и я не думаю, что он поддерживает любой из этих параметров. Я также заинтересован в том, чтобы держать вещи в независимости от выбора сервера, насколько это возможно, в случае, если я позже изменю сервер. Я понимаю, что EJB - это способ сделать это, моя единственная забота заключается в том, что объекты, перемещающиеся с моего уровня интеграции на мой прикладной уровень, являются DAO, и по какой-то причине мне кажется неправильным сделать их EJB. Я ошибаюсь ? – eitanfar
@eitanfar, если вы используете EJB для этого, это ваш уровень интерфейса, который должен быть EJB (точнее, сессионные компоненты без состояния), а не сами DAO! То, как я реализовал это, - это иметь EJB-слой для интерфейса -> компонентный сервисный интерфейс -> реализация компонента - внутренние DAO. Это позволяет максимально развязывать и разделять проблемы, которые мне нужны. Кроме того, для всех моих EJB есть отдельный делегат EJB, который фактически используется для поиска, поэтому тот факт, что поиск EJB сделан, невидим для прикладного уровня. Затем делегат EJB может использоваться как POJO. – eis
Я понимаю, что это может быть больше слоев, чем вы хотите, и, конечно, не обязательно иметь это много слоев. – eis