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

StackOverflow https://stackoverflow.com/questions/634255

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Когда 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 () { .. }

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

Это работает

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top