2014-09-04 2 views
1

Поскольку EJB 3.1, компоненты не должны иметь локальный интерфейс, и я обычно не использую один:EJB 3.1 - Почему безжизненный bean-компонент должен быть введен его интерфейсом (если он есть)?

@Stateless 
public class MyService(){ 
    public void buisnesssMethodA(){ 
     ... 
    } 

    public void buisnesssMethodB(){ 
     ... 
    } 
} 

и в моем КДИ боб я просто

@Inject 
private MyService myService; 

Это легко и просто, и все работает отлично.

Теперь я недавно что-то обнаружил.

Представьте себе, что мне нужен интерфейс, который представляет собой подмножество моего бизнес-метода.

public interface MyInterface{ 
    void businessMethodA(); 
} 

Теперь, если я сделаю мой Stateless боб реализовать этот интерфейс, JBoss не удается развернуть и бросает ошибку

WELD-001408 Unsatisfied dependencies for type [MyService] with qualifiers [@Default] at injection point [[field] @Inject 

Так что я считаю, что я соблюдая следующее правило:

Если у компонента без состояния нет интерфейса, его можно ввести с помощью класса. Если он реализует интерфейс, он должен быть введен с использованием интерфейса.

Вот мои вопросы:

  1. Является ли это правило верно?
  2. Если это так определено спецификациями EBJ?
  3. В чем причина этого ограничения?
+1

Я не могу отмените свои quetions, но если вам нравится обходной путь, вы можете попробовать аннотацию '@ LocalBean'. Это помогло мне в аналогичной ситуации. – Tom

+0

@Tom То, что мне нужно, спасибо! – phoenix7360

ответ

0

Из моего ограниченного знания Java EE и CDI:

  • CDI не управляет EJB 3.1 сессионных компоненты самого по себе (это не будет иметь все жизненный цикл и перехватчик), но он может @Inject открытые локальные представления этих фанов
  • сеансовый bean-компонент может отображать представление локального бизнес-интерфейса, если он имеет интерфейс или представление без интерфейса (состоящее из открытых методов beans)
  • в Java EE 7, когда сеансовый компонент не реализует никакого интерфейса, по умолчанию он предоставляет представление без интерфейса - следовательно, вы могли бы встраивать MyService без интерфейса. Это эквивалентно аннотации компонента с @LocalBean. Обратите внимание, что с @LocalBean вы обнаруживаете представление no-inerface, даже если класс bean реализует интерфейс - поэтому комментарий от Tom работал
  • в Java EE 7, если сеансовый компонент реализует интерфейс и не помечен как @LocalBean, этот интерфейс по умолчанию подвергаются, как локальный вид боба - следовательно, вы не могли бы вводить MyService после того, как реализован MyInterface, так как не-интерфейс зрения (MyService) уже не подвергается, и вид интерфейса MyInterface был разоблачен как локальный вид вместо

Надеюсь, это ответит на ваш вопрос 3 и частично подтвердит, частично отменит ваше правило от questoin 1. Я не могу беспокоиться сейчас, чтобы ответить на вопрос 2, хотя ...

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