2015-11-18 4 views
0

Имея @Stateless public class EjbService {...}, является @Inject EjbService myService; ок?Могу ли я вставить EjbService в CDI вместо @Ejb?

Будет ли он действительно вводить SLSB, или он создаст новое pojo?
Будет ли такой вставленный myService быть транзакционным?
Будет ли такой вставленный myService быть потокобезопасным?

+0

Добро пожаловать в переполнение стека! Я отредактировал ваш вопрос, чтобы было легче понять. Удачи! – bfontaine

+1

Если ваш контейнер использует версию CDI, которая является частью спецификации Java EE 7, вы можете использовать '@ inject' для EJB в ваших управляемых, резервных и CDI-компонентах, если хотите. Если вы получаете ошибки, это, скорее всего, потому, что ваш сервер приложений не совместим с Java EE 7 (что является обычным явлением, там не так много серверов приложений Java EE 7). TomEE, например, реализует веб-профиль Java EE 6. – scottb

ответ

0

Как отметил @scottb, если это определенная версия спецификации, EJB будет введена, поскольку EJB - это надмножество инъекционных объектов.

Сказав это, давайте идти один за другим:

  1. Новый POJO? Если он не привязан к предварительно определенному контексту CDI, то это будет новый POJO. Это может также отличаться сервером приложений.

  2. Transactional? Это полностью зависит от сервера приложений, и если сканирование сервера приложений распознает EJB, это зависит от типа транзакционного управления, настроенного в конфигурации EJB.

  3. Нить-сейф? Если он создается как POJO контейнером, он наследует поточно-безопасные характеристики контейнера (например, контейнер сервлетов). Опять же, сервер приложений может сканировать его как EJB и поддерживать многопоточность в стиле EJB при вводе в качестве POJO.

Таким образом, вы можете ввести SLSB в качестве POJO, поскольку это POJO. Тем не менее, вы не можете полагаться на поведение, специфичное для EJB, когда вы вводите таким образом, если вы не проверили все на своем сервере приложений, что может быть сложнее и подвержено ошибкам, чем просто использовать сервер приложений, поддерживающий EJB.

Короче говоря, когда вы просто вводите EJB в качестве POJO, вы являетесь «вне спецификации». Это означает, что сервер приложений не гарантирует соответствие спецификациям EJB.

+1

Чтобы быть ясным, если контейнер CDI интегрирован с контейнером EJB, тогда для ввода EJB-ссылки требуется не только POJO, а '@ Inject'. Если контейнер CDI не интегрирован с контейнером EJB, он будет возвращать POJO, как вы говорите. –

Смежные вопросы