2010-01-07 22 views
12

Tengo un EJB sin estado que Accesos mi base de datos. necesito este bean en un convertidor JSF 2 a retreive un objeto de entidad a partir del parámetro valor de cadena. Estoy usando JEE6 con Glassfish V3.Inyectar un EJB en un convertidor de JSF con JEE6

@EJB anotación no funciona y obtiene un NPE, porque está en el contexto de las caras y no tiene acceso al contexto EJB.

Mi pregunta es: ¿Todavía es posible inyectar este bean con un @Resource u otra anotación, o una búsqueda JNDI, o necesito una solución?


Solución

hacer una búsqueda JNDI de esta manera:

try { 
    ic = new InitialContext(); 
    myejb= (MyEJB) ic 
    .lookup("java:global/xxxx/MyEJB"); 
    } catch (NamingException e) { 
    e.printStackTrace(); 
    } 

Respuesta

6

nunca he usado JSF 2.0 (sólo 1.0), pero el capítulo 5.4 de la especificación dice:

[...] deje el recipiente para inyectar referencias a recursos gestionada por contenedor en una instancia administrada de beans antes de que sea accesible a la aplicación JSF. Sólo granos declarada en la solicitud, sesión, o ámbito de aplicación son eligble para la inyección de recursos.

Pero hasta ahora entiendo, una búsqueda JNDI debería hacer el truco.

+0

búsqueda JNDI no funciona. Intenté @EJB (mappedName = "java: global/myProject/myEJB") donde el valor que glassfish genera en la consola como "nombre JNDI portátil" de mi EJB al implementar –

+2

no utiliza la anotación @EJB. Obtenga el componente de destino usando InitialContext. – Bozho

+0

@Bozho: ¡InitialContext funcionó! :) Gracias –

2

otra solución (todavía no tan bonito) puede ser el uso de la unión en lugar de converterID. El uso de JSF sólo logró granos:

< f: conversor de unión = "# {} app.personConverter"/>

Dónde appBean significa algo así como: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

puede haber una solución mejor en CDI al estilo de (JSR-299) pero he fallaron para hacer de este uno corriendo:

< f: convertidor de unión = "# {} cdiBean"/>

Dónde cidBean debería ser: @Named class CdiBean implements Converter { @EJB ... }

error con el comportamiento por defecto invocado de requerir un convertidor-id indicado en el constructor '

De todos modos primera aproximación mediante la unión y la aplicación JSF con ámbito de frijol funciona.

2

no sé si esta solución es bastante ...pero funciona:

@ManagedBean 
public class AcquisitionConverter implements Converter 
{ 
    @EJB 
    private AcquisitionService service; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     ... 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     ... 
    } 
} 

y

<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}"> 

con JSF 2.1.3 (mojarra) y GlassFish 3.1.1

+0

La anotación '@ FacesConverter' es por cierto superflua en este constructo (y solo confunde a los principiantes). Eliminarlo – BalusC

+0

ok, lo eliminé :) –

+0

the converter = "# {acquisitionConverter}" fueron las cosas que no funcionaron para mí –

Cuestiones relacionadas