Ottenere EntityManager / EJB all'interno di A @ FacConverter / Validatore di un'app confezionata da guerra
-
17-09-2020 - |
Domanda
Ho un'applicazione Javae6-Aspetto in esecuzione su GlassFish V3.0.1 con EJB 3.1 (l'app è confezionata come guerra), e tutti i miei EJB sono @Localbeans. Attualmente, sto scrivendo un facesconverter per l'uso in JSF2, in cui ho bisogno dell'entitàManager per ottenere un'entità da un ID.
Ora mi chiedo, che è il modo migliore e il modo più pulito per ottenere l'entitymanager all'interno del facesconverter, ora che siamo su Jee6?O posso persino accedere a un EJB attraverso il linguaggio dell'espressione?E la saldatura / CDI non funziona all'interno di un facesconverter, o lo fa?
@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) {...}
}
.
Scusa, spero che questo non sia duplicato, ma la maggior parte dei casi che ho visto dove leggermente diverso e non mi ha aiutato molto.
Soluzione 2
Ok dopo alcuni che provavo ho ottenuto un EJB con successo con una ricerca manuale:
Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())
.
Sembra a posto, ma comunque, se ci sono altri approcci interessanti, sentiti libero di pubblicarli.
Altri suggerimenti
Sto anche utilizzando la ricerca manuale, ma ho creato un'interfaccia convertitore di implementazione di classe astratta, per estendere a diversi convertitori e avere un metodo per ottenere EJB.Per riportarlo in diverse app ho fatto quanto segue per ottenere appname e il nome del modulo 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);
}
}
. Ho appena usato @ejb per iniettarli nei miei convertitori.