Как я могу выбрать локальный интерфейс для EJB?
Вопрос
Скажем, у меня есть следующий 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 () { ... }
Это работает