4

私は溶接のドキュメントに従います

セクション 4.11 で。インジェクションポイント オブジェクト

CDI を使用して http パラメータを取得する方法について、非常に興味深い例があります。

しかし、コードをコピーしてネットビーンズに貼り付けました。すべてがコンパイルされますが、展開エラーがあります

原因: org.jboss.weld.exceptions.DeploymentException: WELD-001408 インジェクション ポイントに満たされていない依存関係があります。インジェクション ポイント: java.lang.String のパラメータ 1 com.test.HttpParamProducer.getParamValue(javax.enterprise.inject.spi.InjectionPoint,javax.servlet.ServletRequest); 修飾子: [@javax.enterprise.inject.Default()]

この問題を解決する方法???

public class HttpParamProducer {

   @HttpParam("")
   @Produces
   String getParamValue(
           InjectionPoint ip, ServletRequest request) {

      return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());

   }
}
4

2 に答える 2

0

プロデューサーメソッドのすべてのパラメーターが注入され、どのBean(プロデューサーを含む)もこの注入ポイントを満たすAPIタイプServletRequestを提供しません。

于 2011-01-18T23:21:00.930 に答える
0

2年後、この質問はまだ興味があるようです

これは、コンテナーが HttpServletRequest を注入可能な Bean として公開する必要がない、CDI 仕様の短編です。

ここに合理的な回避策があります

@WebListener 
public class HttpServletRequestProducer implements ServletRequestListener {
    private final static ThreadLocal<HttpServletRequest> holder = new ThreadLocal<HttpServletRequest>();

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

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

    @Produces @RequestScoped HttpServletRequest get() {
        return holder.get();
    }
}

@Inject HttpServletRequest が期待どおりに機能するようになりました

ハッピーコーディング

于 2012-11-02T03:52:23.073 に答える