Если ваш 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 .
сессионный компонент Bявно включить Foo в набор открытых представлений для этого интерфейса.
Обновление:
В качестве дополнения еще одна выдержка из спецификации:
Класс сессионных компонентов может иметь суперклассы, которые сами являются классами сессионных компонентов.Однако для этого случая нет специальных правил, применимых к обработке аннотаций или дескриптора развертывания.В целях обработки определенного класса сессионных компонентов вся обработка суперкласса идентична независимо от того, являются ли суперклассы самими классами сессионных компонентов.