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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top