1

我有一个 JavaEE6 应用程序在 Glassfish v3.0.1 和 EJB 3.1 上运行(应用程序打包为 WAR),我所有的 EJB 都是 @LocalBeans。目前,我正在编写一个用于 JSF2 的 FacesConverter,其中我需要 EntityManager 从一个 id 中获取一个实体。

现在我想知道,既然我们在 JEE6 上,那么在 FacesConverter 中获取 Entitymanager的最佳和最干净的方法是什么?或者我什至可以通过表达式语言访问 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) {...}
}

抱歉,我希望这不是重复的,但我看到的大多数情况略有不同,对我没有多大帮助。

4

3 回答 3

1

我也在使用手动查找,但我创建了一个实现 Converter 接口的抽象类,以扩展到不同的 Converters 并具有获取 EJB 的方法。为了在不同的应用程序中重用它,我做了以下获取 Appname 和 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);
    }
}
于 2011-01-03T11:25:33.583 回答
0

好的,经过一番尝试,我成功获得了一个手动查找的 EJB:

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

看起来不错,但无论如何,如果有其他有趣的方法,请随时发布。

于 2010-07-19T21:13:39.497 回答
0

我刚刚使用@EJB 将它们注入到我的转换器中。

于 2011-02-09T22:57:53.170 回答