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

Скажем, у меня есть следующий 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.

Ответы [ 3 ]

3 голосов
/ 19 марта 2009

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

РЕДАКТИРОВАТЬ: см. Раздел 3.2 в "EJB3 spec упрощен" в http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

1 голос
/ 09 июня 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 () { ... }

Работает

1 голос
/ 11 марта 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 () { .. }
...