Pregunta

He estado luchando por esto desde hace un tiempo.

Estoy tratando de gear up para EJB 3.0.Estoy usando JBoss 5.1.0 GA como mi servidor de aplicaciones.Empecé con muy sencillo bean de sesión sin estado con la interfaz local y un simple jsp-servlets cliente que invoca un bean de sesión método.Todo este tiempo he estado tratando de utilizar @EJB anotación para inyectar un bean de sesión en el servlet de la clase.

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());       
    }
}

Estoy usando JBoss 5.1.0 GA con el por defecto de configuración.(También probé con todos de configuración)

Sin embargo, solía tener una referencia nula para el bean de sesión de la inyección.Después de luchar durante un día o así, finalmente he probado el feo EJB 2.x JNDI método de búsqueda en lugar de @EJB la anotación con la configuración para jndi especificado en el jndi.properties archivo y funcionó sin ningún tipo de cambios!

Ahora, traté de averiguar en el JBoss docs si JBoss 5.1.0 GA o no el apoyo de la inyección con @EJB la anotación, pero no podía encontrar una respuesta concreta.Así que ¿alguien me puede decir si lo hace?porque yo realmente preferiría anotaciones sobre JNDI de búsqueda (quiero decir, ¿quién no?).Me estoy perdiendo algo..?

Probablemente debería haber puesto esto en el JBoss foros, pero..Soy adicta a este lugar ;-)

¿Fue útil?

Solución

Este es, sin duda apoyado por JBoss 5.x ya que es certificado Java EE 5.

En realidad, me sugieren para comprobar la El capítulo 11.Introducción a EJB inyección en Servlets de la JBoss EJB3 Tutoriales, describen una detallada y paso a paso el ejemplo.

Y pagar a un particular atención a la siguiente nota:

Para la inyección en un lugar de módulo web, su web.xml debe utilizar la versión 2.5 de la 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">

Otros consejos

Tuve un problema similar al usar un EJB remoto, pero no se debió a la versión de la aplicación web, sino a cómo mi cliente buscaba el EJB.

Esto es lo que funcionó para mí:

//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 mi proyecto (creado con Maven), el cliente está en una aplicación web y el EJB está en un proyecto EJB que luego se integra en un proyecto EAR.El mapeo JNDI ocurre en jboss.xml, que se encuentra en el proyecto EJB (en mi proyecto, src/main/resources/META-INF), y tiene este aspecto:

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

Eso es todo lo que hizo falta y ahora puedo acceder al EJB desde el cliente.Espero que esto ayude a alguien.

Si aún tiene problemas, puede buscar en la consola JMX para asegurarse de que aparezca la entrada JNDI.Busque en 'jboss'>'service=JNDIview'>'list' y haga clic en el botón 'invocar'.Si su servicio se implementa correctamente, debería ver el nombre JNDI (en mi ejemplo, myJndiNameForxxxx) en 'ProxyFactory'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top