Ottenere EntityManager / EJB all'interno di A @ FacConverter / Validatore di un'app confezionata da guerra

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

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top