5

セッション スコープの CDI Bean がありHttpServletRequest、この Bean の @PostConstruct メソッドで何らかの方法でオブジェクトにアクセスする必要があります。出来ますか?そのようなオブジェクトを注入しようとしましたが、結果は次のようになります。

WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers     [@Default] at injection point [[field] @Inject ...]

グーグルで理解したように、Seam フレームワークにはそのような機能がありますが、GlassFish サーバーには標準の Java EE アプリケーションがあります。

どうにかしてリクエストを CDI Bean の@PostConstructメソッドに渡すことさえ可能ですか?

4

2 に答える 2

12

コメントによると、ユーザー プリンシパルへのアクセスが必要です。次のように注入できます:@Inject Principal principal;または、 Java EE 6 チュートリアル@Resource Principal principal;を参照してください。

アップデート

直接の質問にお答えします。Java EE 7 (CDI 1.1) では、HttpServletRequest のインジェクションがすぐにサポートされます。ただし、Java EE 6 (CDI 1.0) では、これはそのままではサポートされていません。機能させるには、以下のクラスを Web アプリに含めます。

import javax.enterprise.inject.Produces;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class CDIServletRequestProducingListener implements ServletRequestListener {

    private static ThreadLocal<ServletRequest> SERVLET_REQUESTS = new ThreadLocal<>();

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        SERVLET_REQUESTS.set(sre.getServletRequest());
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        SERVLET_REQUESTS.remove();
    }

    @Produces
    private ServletRequest obtain() {
        return SERVLET_REQUESTS.get();
    }

}

注: GlassFish 3.1.2.2 でのみテスト済み

于 2013-08-12T16:37:36.730 に答える