Pergunta

Estou lutando por isso há algum tempo.

Estou tentando me preparar para o EJB 3.0.Estou usando o JBoss 5.1.0 GA como meu servidor de aplicativos.Comecei com um bean de sessão sem estado muito simples com interface local e um cliente jsp-servlet simples que invoca o método bean de sessão.Tudo isso enquanto venho tentando usar @EJB anotação para injetar o bean de sessão na classe do servlet.

public class SampleServlet extends HttpServlet {

    @EJB
    private PersonLocal person;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        System.out.println("In servlet");       
        response.getWriter().write("Person Name : "+person.getName());
        System.out.println(person.getName());       
    }
}

Estou usando o JBoss 5.1.0 GA com o padrão configuração.(Eu também tentei com todos configuração)

No entanto, eu costumava obter uma referência nula para a injeção do bean de sessão.Depois de lutar por mais ou menos um dia, finalmente tentei o feio método de pesquisa JNDI EJB 2.x em vez de @EJB anotação com configuração para jndi especificada no jndi.properties arquivo e funcionou sem quaisquer outras alterações!

Agora, tentei descobrir na documentação do JBoss se o JBoss 5.1.0 GA suporta ou não a injeção com @EJB anotação, mas não conseguiu encontrar uma resposta concreta.Então alguém pode me dizer se isso acontece?porque eu realmente preferiria a anotação à pesquisa JNDI (quero dizer, quem não preferirá?).Estou esquecendo de algo..?

Provavelmente deveria ter colocado isso nos fóruns do JBoss, mas ..Estou viciada neste lugar ;-)

Foi útil?

Solução

Definitivamente, isso é suportado pelo JBoss 5.x, pois é certificado pelo Java EE 5.

Na verdade, sugiro verificar o Capítulo 11.Introdução à injeção EJB em Servlets do Tutoriais JBoss EJB3, eles descrevem um exemplo detalhado e passo a passo.

E preste especial atenção à seguinte nota:

Para que a injeção ocorra em uma seringa módulo web, seu web.xml deve usar A versão 2.5 do Web-App XSD:

<web-app version="2.5"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

Outras dicas

Tive um problema semelhante ao usar um EJB remoto, mas não foi devido à versão do aplicativo da web, mas sim à forma como meu cliente estava procurando o EJB.

Aqui está o que funcionou para mim:

//bean
@Stateless(name="xxxxService")
@Remote(xxxxRemote.class)
public class xxxxService implements xxxxRemote {

//interface - note that no annnotation is required
public interface xxxxRemote {

//in the client
  @EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName='
  private xxxxRemote xxxx;

Para o meu projeto (construído com Maven), o cliente está em um webapp e o EJB está em um projeto EJB que é então agrupado em um projeto EAR.O mapeamento JNDI ocorre no jboss.xml, que reside no projeto EJB (no meu projeto, src/main/resources/META-INF) e tem a seguinte aparência:

<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema"
       xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
       version="5.0">
  <enterprise-beans>
  <session>
      <ejb-name>xxxxService</ejb-name>
      <jndi-name>myJndiNameForxxxx</jndi-name>
  </session>
  </enterprise-beans>
</jboss>

Bastou isso e agora posso acessar o EJB do cliente.Espero que isso ajude alguém.

Se ainda estiver tendo problemas, você pode procurar no console JMX para ter certeza de que a entrada JNDI aparece.Procure em 'jboss'>'service=JNDIview'>'list' e clique no botão 'invoke'.Se o seu serviço for implementado corretamente, você deverá ver o nome JNDI (no meu exemplo, myJndiNameForxxxx) em 'ProxyFactory'.

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