Obtendo Entitymanager/EJB dentro de um @FacesConverter/Validator de um aplicativo empacotado WAR

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

Pergunta

Eu tenho um aplicativo JavaEE6 em execução no Glassfish v3.0.1 com EJB 3.1 (o aplicativo é empacotado como WAR) e todos os meus EJBs são @LocalBeans.Atualmente, estou escrevendo um FacesConverter para uso em JSF2, no qual preciso do EntityManager para recuperar uma Entidade de um ID.

Agora eu me pergunto, qual é o melhor e mais limpa de colocar o Entitymanager dentro do FacesConverter, agora que estamos no JEE6?Ou posso até acessar um EJB através da Expression Language?E o Weld/CDI não funciona dentro de um FacesConverter, ou funciona?

@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) {...}
}

Desculpe, espero que não seja uma duplicata, mas a maioria dos casos que vi foram um pouco diferentes e não me ajudaram muito.

Foi útil?

Solução 2

Ok, depois de algumas tentativas, consegui um EJB com uma pesquisa manual:

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

Parece bom, mas de qualquer forma, se houver outras abordagens interessantes, fique à vontade para publicá-las.

Outras dicas

Também estou usando pesquisa manual, mas criei uma classe abstrata implementando a interface Converter, para estender a diferentes conversores e ter um método para obter EJBs.Para reutilizá-lo em diferentes aplicativos, fiz o seguinte para obter o nome do aplicativo e o nome do módulo da 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);
    }
}

Acabei de usar @EJB para injetá-los em meus conversores.

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