Domanda

Sto lottando per questo da un po' ormai.

Sto cercando di prepararmi per EJB 3.0.Utilizzo JBoss 5.1.0 GA come server delle applicazioni.Ho iniziato con un bean di sessione stateless molto semplice con interfaccia locale e un semplice client jsp-servlet che richiama il metodo del bean di sessione.Tutto questo mentre cercavo di usare @EJB annotazione per inserire il bean di sessione nella classe 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());       
    }
}

Sto utilizzando JBoss 5.1.0 GA con predefinito configurazione.(Ho provato anche con Tutto configurazione)

Tuttavia, ottenevo un riferimento nullo all'iniezione del bean di sessione.Dopo aver lottato per circa un giorno, ho finalmente provato il brutto metodo di ricerca JNDI EJB 2.x invece di @EJB annotazione con configurazione per jndi specificata nel file jndi.properties file e ha funzionato senza altre modifiche!

Ora, ho provato a scoprire nella documentazione di JBoss se JBoss 5.1.0 GA supporta o meno l'iniezione con @EJB annotazione, ma non sono riuscito a trovare una risposta concreta.Quindi qualcuno può dirmi se è così?perché preferirei davvero l'annotazione rispetto alla ricerca JNDI (voglio dire, chi non lo farà?).Mi sto perdendo qualcosa..?

Probabilmente avrei dovuto inserirlo nei forum di JBoss, ma...Sono dipendente da questo posto ;-)

È stato utile?

Soluzione

Questo è sicuramente supportato da JBoss 5.x poiché è certificato Java EE 5.

In realtà, suggerisco di controllare il Capitolo 11.Introduzione all'iniezione EJB nelle servlet del Tutorial su JBoss EJB3, descrivono un esempio dettagliato e passo passo.

E prestare particolare attenzione alla seguente nota:

Affinché l'iniezione abbia luogo in un modulo Web, il tuo Web.xml dovrebbe utilizzare la versione 2.5 del 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">

Altri suggerimenti

Ho riscontrato un problema simile utilizzando un EJB remoto, ma non era dovuto alla versione dell'app Web, ma piuttosto al modo in cui il mio cliente stava cercando l'EJB.

Ecco cosa ha funzionato per me:

//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;

Per il mio progetto (realizzato con Maven), il client è in una webapp e l'EJB è in un progetto EJB che viene quindi racchiuso in un progetto EAR.La mappatura JNDI avviene in jboss.xml, che risiede nel progetto EJB (nel mio progetto, src/main/resources/META-INF), e assomiglia a questo:

<?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>

Questo è tutto ciò che serve e ora posso accedere all'EJB dal client.Spero che questo aiuti qualcuno.

Se i problemi persistono, puoi controllare nella console JMX per assicurarti che venga visualizzata la voce JNDI.Cerca sotto 'jboss'>'service=JNDIview'>'list' e fai clic sul pulsante 'richiama'.Se il tuo servizio è distribuito correttamente, dovresti vedere il nome JNDI (nel mio esempio, myJndiNameForxxxx) sotto "ProxyFactory".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top