Как я могу выбрать локальный интерфейс для EJB?

Скажем, у меня есть следующий EJB (с использованием ejb3):

@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.


person johnstok    schedule 11.03.2009    source источник


Ответы (3)


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

РЕДАКТИРОВАТЬ: См. Раздел 3.2 в «Упрощенной спецификации EJB3» на странице http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html.

person Antonio    schedule 19.03.2009
comment
У вас есть ссылка на спецификацию для этого? - person johnstok; 20.03.2009
comment
1. Перейдите на страницу jcp.org/aboutJava/communityprocess/final/jsr220/index. html 2. Нажмите кнопку ниже, чтобы загрузить Спецификацию для оценки или создать приложение, использующее Спецификацию 3. Загрузите ejb-3_0-fr-spec-simpleified.pdf 4. Перейдите на страницу 16, пункт 3.2 - person Antonio; 20.03.2009

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

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

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

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

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

public interface Queries () { .. }

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

@Remote
public interface QueriesRemote extends Queries () { .. }
person Timo    schedule 11.03.2009

Решения из предыдущих комментариев не полностью совместимы с 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 () { ... }

Оно работает

person Community    schedule 09.06.2009