代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

将EntityManager/EJB放入一个战争包应用程序的@FacesConverter/Validator中

  •  1
  • Wolkenarchitekt  · 技术社区  · 14 年前

    我有一个Javae6应用程序运行在Glassfish v3.0.1和EJB3.1上(应用程序打包为war),我的所有EJB都是@localbeans。 目前,我正在编写一个在JSF2中使用的FacesConverter,在JSF2中,我需要EntityManager从ID中获取一个实体。

    现在我想知道,哪个是 最好的 把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 回复  |  直到 13 年前
        1
  •  1
  •   icordoba    13 年前

    我也在使用手动查找,但是我创建了一个实现转换器接口的抽象类,以扩展到不同的转换器,并有一个方法来获取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);
        }
    }
    
        2
  •  0
  •   Wolkenarchitekt    13 年前

    好吧,在尝试了一些之后,我成功地获得了一个带有手动查找的EJB:

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

    看起来不错,但不管怎样,如果有其他有趣的方法,请随时张贴它们。

        3
  •  0
  •   Brian Leathem    13 年前

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

    推荐文章