Получение Entitymanager / EJB внутри @ FacesConverter / Validator для WAR-упакованного приложения - PullRequest
1 голос
/ 20 июля 2010

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

Теперь мне интересно, какой самый лучший и лучший способ 1004 * получить 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) {...}
}

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

Ответы [ 3 ]

1 голос
/ 03 января 2011

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

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 голосов
/ 10 февраля 2011

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

0 голосов
/ 20 июля 2010

Хорошо, после некоторых попыток я успешно получил EJB с ручным поиском:

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

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

...