Como posso selecionar a interface local para um EJB?
Pergunta
Say Eu tenho o seguinte EJB (usando ejb3):
@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
...
}
A classe está disponível através de ambos um local e uma interface remota.
Como posso injetar a interface local para esta EJB em outra parte do aplicativo?
Especificamente, eu não tenho certeza de como criar uma anotação @EJB que seleciona os Local interface. Por exemplo, é o seguinte suficiente?
@EJB(name="Queries") private Queries queries;
Em particular eu quero evitar a criação de interfaces locais e remotas separadas simplesmente com a finalidade de distinguir via @ propriedade do EJB 'beanInterface'.
Solução
De acordo com a especificação você não pode ter uma interface que é remoto e local ao mesmo tempo. No entanto, pode criar um super-interface, colocar todos os métodos lá, e em seguida, criar 2 sub-interfaces. Tendo feito isso, basta usar @EJB. Desta forma, você precisa manter apenas uma interface em tudo.
EDIT: Ver secção 3.2 em "especificação EJB3 simplificado" em http: / /jcp.org/aboutJava/communityprocess/final/jsr220/index.html
Outras dicas
Quando um EJB for implantado, o recipiente olha para as interfaces e identifica locais e interfaces remotas. Eu diria que o container EJB já usa a interface local no seu exemplo. Ele simplesmente não faz sence de usar uma interface remota neste caso, porque o recipiente tem a opção de usar o local.
Se você quer ter certeza de tentar usar o nome JNDI da interface local como parâmetro da anotação @EJB.
@EJB(name="java:comp/env/ejb/EntitySupplierLocal")
No exemplo acima, eu adicionei local para o nome da interface. No seu caso, você tem que ter um olhar para o contexto JNDI para obter o nome correto ou você mesmo sabe disso;).
Geralmente eu recomendo usar uma interface de base que tem os metodos de negócios definidos e estender um local e uma interface remota. Então você não tem que duplicar metodos e que são capazes de estender a funcionalidade para acesso local e remoto seperatly.
public interface Queries () { .. }
@Local
public interface QueriesLocal extends Queries () { .. }
@Remote
public interface QueriesRemote extends Queries () { .. }
Soluções de comentários anteriores não são compatibile plenamente com EJB 3.0 em Jboss.
Você pode facilmente obter este erro:
org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
beanInterface specified, Queries, is not unique within EJB QueriesEJB
Criar apenas isto:
public interface Queries () //Local by default
@Remote
public interface QueriesRemote extends Queries () { ... }
Ele funciona