CDI с JEE: как обрабатывать внедрение зависимостей в бэкэнд без EJB - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над REST API с Java, используя JAX-RS, EJB, JPA и JasperReports, в основном API вызывает функцию оракула, которая возвращает идентификатор, с этим идентификатором я делаю выбор и генерирую отчеты с помощью Jasper Reports , то я отправляю отчет в качестве ответа, работает нормально.

Но у меня есть несколько вопросов, должен ли я использовать или не использовать EJB, потому что я не понимаю, почему я должен использовать EJB в этом случае, так как функция оракула имеет коммит внутри него, если что-то пойдет не так, откат запускается EJB не будет ничего делать правильно? Кроме того, select, который генерирует отчет, прост, всего одна таблица, и я видел несколько статей, в которых говорилось, что если вы делаете просто select, нет необходимости использовать EJB для управления транзакцией.

Кроме того, как использовать CDI в этом случае? @ Имена в классах и @Inject в полях? У меня есть коллеги, которые говорят, что @Named следует использовать только с JSF, но я младший, ищу истину об этом, изучив многое, я до сих пор не знаю, как с этим справиться, я ценю любую помощь. Спасибо!

1 Ответ

0 голосов
/ 30 марта 2019

Нужны ли EJB для транзакций?

Если вы используете JEE-7 +, то вы можете использовать @Transactional для своих CDI Beans вместо EJB-Beans с @Stateless и @TransactionManagement и @TransactionAttribute.@Transactional предоставляет те же свойства, что и @TransactionAttribute, и делает любой CDI-компонент транзакционным без необходимости в контейнере EJB.Все эти подходы требуют использования JPA, что для простого одиночного запроса может быть избыточным.

https://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

Что я могу использовать вместо EJB и @Transactional?

Если вам не нужно / не нужно использовать EntityManager, просто используйте простой JDBC.

Что делает @Named?

@ Named делает CDI Beans доступным для Java-EL через их определенное имя или, если никто не определен, то через их простое имя класса.Вы также можете использовать @Named, чтобы различать реализации, но я думаю, что для этого лучше подходят CDI Qualifiers.Так что, если вам это не нужно, не аннотируйте его.

Как предоставить компоненты CDI другим компонентам CDI?

На мой взгляд, компоненты CDIдолжен вводиться через поля, а не аргументы конструктора.Инъекция в аргументах конструктора выполняется из-за тестируемости, поэтому вы можете тестировать ваши bean-компоненты без использования CDI, чего в наши дни уже нетрудно достичь.

https://deltaspike.apache.org/documentation/test-control.html

...