War-Packaged Appの@ facesconverter / validatorの内側にEntityManager / EJBを取得する
-
17-09-2020 - |
質問
私はGlassFish v3.0.1でjavaee6-applicationを持っています.JB 3.1(アプリは戦争としてパッケージ化されています)、そして私のEJBはすべて@localbeansです。 現在、JSF2で使用するためのFacesconverterを書いています。
今、私たちがFacesconverterの中にEntityManagerを入手するための最高のと最もきれいな方法です。あるいは表現言語を通してEJBにアクセスすることができますか?そして溶接/ 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) {...}
}
.
申し訳ありませんが、これが重複していないことを願っていますが、ほとんどの場合、わずかに異なる場所を見たことがあります。
解決 2
OKの後に挑戦した後、私は手動検索でEJBを手に入れました:
Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())
.
は大丈夫に見えますが、とにかく他の興味深いアプローチがある場合は、それらを投稿してください。
他のヒント
手動検索を使用していますが、抽象クラス実装コンバータインタフェースを作成し、さまざまなコンバータに拡張し、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);
}
}
. 私はそれらを私のコンバーターに注入するために@ejbを使っただけです。
所属していません StackOverflow