Conseguir EntityManager / EJB dentro de @ FacesConverter / Validator de una aplicación empaquetada por la guerra

StackOverflow https://stackoverflow.com/questions/3284639

Pregunta

Tengo una aplicación JavaeeE6 que se ejecuta en GlassFish v3.0.1 con EJB 3.1 (la aplicación está envasada como guerra), y todos mis ejes son @localbeans. Actualmente, estoy escribiendo un FacesConverter para su uso en JSF2, en el que necesito la entidad para recuperar una entidad de una identificación.

Ahora me pregunto, ¿cuál es el mejor y la forma más limpia de conseguir la entidad dentro del FacesConverter, ahora que estamos en Jee6?¿O incluso puedo acceder a un EJB a través del lenguaje de expresión?¿Y la soldadura / CDI no funciona dentro de un FacesConverter, o lo hace?

@FacesConverter(value="subscriptionListConverter")
class SubscriptionListConverter extends Converter {
  public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
    var id:Long = Long.parseLong(value);
    // How to get the entitymanager?
    return em.find(User.getClass, id);
  }

  public String getAsString(ctx:FacesContext, comp:UIComponent, value:Object) {...}
}

Lo siento, espero que esto no sea duplicado, pero la mayoría de los casos que vi a donde un poco diferente y no me ayudó mucho.

¿Fue útil?

Solución 2

OK Después de que algunos lo intenten alrededor, obtuve un EJB con una búsqueda manual:

Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())

Se ve bien, pero de todos modos, si hay algunos otros enfoques interesantes, siéntase libre de publicarlos.

Otros consejos

También estoy usando la búsqueda manual, pero he creado una interfaz de convertidor de implementación de clase abstracta, para extender a diferentes convertidores y tener un método para obtener EJBS.Para reutilizarlo en diferentes aplicaciones, he hecho lo siguiente para obtener el nombre de appName y el nombre del módulo web:

abstract public class Converter implements javax.faces.convert.Converter
{
    public Object getManager(String jndiName) throws NamingException
    {
        ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
        Context env = new InitialContext();
        String aname = (String)env.lookup("java:app/AppName");
        if (aname == null || aname.length() == 0 || servletContext.getContextPath().equals(aname)) //FIXME If deploying war inside an ear, appname equals module name, won't work.
            return env.lookup("java:global/" + aname + "/" + jndiName);
        else
            return env.lookup("java:global/" + aname + servletContext.getContextPath() + "/" + jndiName);
    }
}

Acabo de utilizar @EJB para inyectarlos en mis convertidores.

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