1

EJB 3.1 (アプリケーションは WAR としてパッケージ化されています) を使用して Glassfish v3.0.1 で実行されている JavaEE6 アプリケーションがあり、すべての EJB は @LocalBeans です。現在、私はJSF2で使用するためのFacesConverterを書いています.IDからEntityを取得するにはEntityManagerが必要です。

JEE6を使用している今、FacesConverter内にEntitymanagerを取得するための最良かつ最もクリーンな方法はどれでしょうか? または、Expression Language を介して 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

私も手動ルックアップを使用していますが、別のコンバーターに拡張し、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を使用して、それらをコンバーターに注入しました。

于 2011-02-09T22:57:53.170 に答える
0

いくつか試した後、手動ルックアップでEJBを正常に取得しました:

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

問題ないように見えますが、とにかく、他に興味深いアプローチがあれば、遠慮なく投稿してください。

于 2010-07-19T21:13:39.497 に答える