我在Glassfish v3.0.1上使用EJB 3.1运行JavaEE6应用程序(应用程序打包为WAR),我的所有EJB都是@LocalBeans。 目前,我正在编写一个用于JSF2的FacesConverter,我需要EntityManager从id中获取一个Entity。
现在我想知道,现在我们在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) {...}
}
对不起,我希望这不重复,但大多数情况下,我看到的地方略有不同,对我没什么帮助。
答案 0 :(得分:1)
我也在使用手动查找,但我创建了一个实现Converter接口的抽象类,以扩展到不同的转换器并拥有一个获取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);
}
}
答案 1 :(得分:0)
好的经过一些尝试,我成功地获得了一个带有手动查找的EJB:
Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())
看起来没问题,但无论如何,如果还有其他有趣的方法,请随时发布。
答案 2 :(得分:0)
我刚刚使用@EJB将它们注入我的转换器。