2012-01-29 4 views
7

До сих пор я почти всегда работал с без интерфейсом EJB и немного разбирался в необходимости аннотации @Local. Рассмотрим следующий пример:EJB 3.1. Нужна ли @Local аннотация?

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

Если MyBeanIntf быть помечено как @Local? Я не вижу никакой пользы от этого, потому что даже когда я не аннотировать его как @Local, я все еще могу использовать DI правильно внедрить его в контроллер пользовательского интерфейса:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    // injection works perfectly, even when MyBeanIntf is not marked as @Local 
    @Inject 
    private MyBeanIntf myBean; 

    // or even like this: 
    // @EJB 
    // private MyBeanIntf myBean; 

} 

Давайте усложним его:

public interface MyBeanIntf { void doStuff(); } 
public class MySuperBean implements MyBeanIntf { public void doStuff() { } } 

@Stateless 
public class MyBean extends MySuperBean { } 

ли MyBean теперь считается действительным Local EJB боб? У меня есть некоторые сомнения, потому что он реализует интерфейс косвенно.

ответ

8

Если ваш EJB реализует какой-либо интерфейс, но вы не указываете (ни на EJB, ни на сам интерфейс), какой интерфейс он (@Remote, @Local), чем предполагается, что это @Local.

Поэтому ваш код:

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

семантически идентичен следующему:

@Local 
public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

Когда речь идет о второй части вашего вопроса, я думаю, что раздел 4.9.2.1 Session Bean Суперклассы от EJB 3.1 Спецификация FR будет интересна для вас. Из моего понимания (так что не может быть правильным), кажется, что ваш компонент не следует рассматривать как разоблачение действительный Локальный интерфейс из следующего отрывка:

@Stateless 
public class A implements Foo { ... } 

@Stateless 
public class B extends A implements Bar { ... } 

Предполагая, что Foo и Bar являются местные бизнес-интерфейсы и нет связанного дескриптора развертывания, сеансового компонента A выдает локальный бизнес-интерфейс Foo и сеансовый бит B предоставляет локальный бизнес интерфейс Bar, но не Foo.

Session bean B необходимо будет явно включить Foo в свой набор разоблаченных представлений для этого интерфейса.

Update:

В дополнение еще один отрывок из спецификации:

Сеанс класс боб разрешено иметь суперкласса, которые сами сессии классы боба. Однако нет специальных правил , которые применяются к обработке аннотаций или описанию развертывания для этого случая. Для целей обработки конкретного класса bean-класса вся обработка суперкласса идентична независимо от того, являются ли суперклассы самими сеансовыми классами.

+0

Спасибо за ответ. Что касается ссылки на спецификацию, у меня все еще есть некоторые сомнения. В нем явно обсуждаются суперклассы, которые сами являются сеансовыми. Но что, если они просто абстрактные классы без аннотации '@ Stateless' или' @ Stateful'? – jFrenetic

+0

Конечно, я не уверен в этом на 100%, но взгляните на отредактированный пост - возможно, это поможет. –

+1

Спасибо за внимание. Я сам прочитал эту часть в спецификации, но почему-то ее пропустил. – jFrenetic