2009-03-11 4 views
0

Скажем, у меня есть следующие EJB (с использованием EJB3):Как выбрать локальный интерфейс для EJB?

@Stateless(name="Queries") 
@Remote(Queries.class) 
@Local(Queries.class) 
public final class QueriesEJB implements Queries { 
    ... 
} 

Класс доступен как через локальный и удаленный интерфейс.

Как я могу ввести локальный интерфейс для этого EJB в другую часть приложения?

В частности, я не уверен, как создать аннотацию @EJB, которая выбирает локальный интерфейс . Например, достаточно ли следующего?

@EJB(name="Queries") private Queries queries; 

В частности, я хочу, чтобы избежать создания отдельных локальных и удаленных интерфейсов просто с целью выделения с помощью свойства «beanInterface» @ EJB.

ответ

3

Согласно спецификации, вы не можете иметь интерфейс Remote и Local в одно и то же время. Тем не менее, вы создаете суперинтерфейс, размещаете там все методы, а затем создаете 2 суб-интерфейса. Сделав это, просто используйте @EJB. Таким образом, вам нужно поддерживать только один интерфейс.

EDIT: Смотрите раздел 3.2 в "EJB3 спецификации упрощенным" на http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

+0

У вас есть спецификация для этого? – johnstok

+0

1. Перейдите на страницу http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html 2. Нажмите «Нажмите кнопку ниже, чтобы загрузить спецификацию для оценки или создать приложение, использующее Specfication» 3. Загрузить ejb-3_0-fr-spec-simplified.pdf 4. На страницу 16, пункт 3.2 – Antonio

1

При развертывании EJB контейнер просматривает интерфейсы и идентифицирует локальные и удаленные интерфейсы. Я бы сказал, что контейнер EJB уже использует локальный интерфейс в вашем примере. В этом случае просто не нужно использовать удаленный интерфейс, потому что у контейнера есть выбор, чтобы использовать локальный.

Если вы хотите убедиться, что используете JNDI-имя локального интерфейса в качестве параметра аннотации @EJB.

@EJB(name="java:comp/env/ejb/EntitySupplierLocal") 

В приведенном выше примере я добавил локальное имя интерфейса. В вашем случае вам нужно взглянуть на контекст JNDI, чтобы получить правильное имя или вы даже знаете его;).

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

public interface Queries() { .. } 

@Local 
public interface QueriesLocal extends Queries() { .. } 

@Remote 
public interface QueriesRemote extends Queries() { .. } 
+0

Я попробовал это в JBoss и удаленный интерфейс был выбран - идти рисунок .. – johnstok

1

решения предыдущих замечаний не полностью совместим с EJB 3.0 на Jboss.

Вы можете легко получить эту ошибку:

org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException: 
beanInterface specified, Queries, is not unique within EJB QueriesEJB 

Создать только это:

public interface Queries() //Local by default 

@Remote 
public interface QueriesRemote extends Queries() { ... } 

Он работает