Obtenir l'entitéManager / EJB à l'intérieur d'un @ facesconverter / validateur d'une application emballée par la guerre

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

Question

J'ai une application Javaee6 fonctionnant sur Glassfish V3.0.1 avec EJB 3.1 (l'application est emballée en tant que guerre), et tous mes EJB sont @Localbeans. Actuellement, j'écris un facesconverter pour une utilisation dans JSF2, dans lequel j'ai besoin de l'entitémanager pour obtenir une entité à partir d'une pièce d'identité.

Maintenant, je me demande, quel est le meilleur et le moyen le plus propre pour obtenir l'entitémanager à l'intérieur du Facsconverter, maintenant que nous sommes sur JeE6?Ou puis-je même accéder à un EJB à travers la langue d'expression?Et Soudd / CDI ne fonctionne pas à l'intérieur d'un facesconverter ou n'est-ce pas?

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

Désolé, j'espère que ce n'est pas dupliqué, mais la plupart des cas que j'ai vus là où il est légèrement différent et ne m'a pas aidé beaucoup.

Était-ce utile?

La solution 2

OK Après avoir essayé d'être entouré, j'ai eu un EJB avec une recherche manuelle:

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

semble bien, mais de toute façon, s'il y a d'autres approches intéressantes, n'hésitez pas à les poster.

Autres conseils

J'utilise également une recherche manuelle mais j'ai créé une interface de convertisseur de classe abstraite, pour étendre à différents convertisseurs et avoir une méthode pour obtenir des EJBS.Pour la réutiliser dans différentes applications, j'ai effectué ce qui suit pour obtenir l'appName et le nom du module 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);
    }
}

Je viens d'utiliser @ejb pour les injecter dans mes convertisseurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top