2010-07-19 3 views
1

У меня есть приложение JavaEE6, работающее на Glassfish v3.0.1 с EJB 3.1 (приложение упаковано как WAR), а все мои EJB - @LocalBeans. В настоящее время я пишу FacesConverter для использования в JSF2, в котором мне нужен EntityManager, чтобы вернуть Entity из идентификатора.Получение Entitymanager/EJB внутри @ FacesConverter/Validator от WAR-упакованного приложения

Теперь мне интересно, что является лучшим и самым чистым способом получить Entitymanager внутри FacesConverter, теперь, когда мы находимся на JEE6? Или я могу получить доступ к EJB через язык выражений? И Weld/CDI не работает внутри FacesConverter или не работает?

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

Извините, я надеюсь, что это не дубликат, но в большинстве случаев я видел, где немного отличается и не очень помог мне.

ответ

0

Ok после того, как некоторые пытаются вокруг я успешно получил EJB с ручным поиском:

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

Выглядит хорошо, но в любом случае, если есть некоторые другие интересные подходы, не стесняйтесь отправлять их.

1

Я также использую ручной поиск, но я создал абстрактный класс, реализующий интерфейс конвертера, чтобы расширить его до разных преобразователей и получить способ получения EJB. Для того, чтобы использовать его в различных приложениях, которые я сделал следующее, чтобы получить APPNAME и имя веб-модуль:

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); 
    } 
} 
0

Я просто использовал @EJB вводить их в свои конвертеры.

+0

AFAIK это должно работать только с Seam Faces, но без него. Преобразователи/Валидаторы не поддерживают инъекцию. По крайней мере, не в конфигурации, упомянутой в моем вопросе. – ifischer