Obtenir l'entitéManager / EJB à l'intérieur d'un @ facesconverter / validateur d'une application emballée par la guerre
-
17-09-2020 - |
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.
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.