16

ejb 3 を使用して @Inject HttpServletRequest を実行しようとしていますが、デプロイ中に例外が発生します。

コード:

@Inject private HttpServletRequest httpRequest;

例外:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers [@Default] at injection point [[field] @Inject private com.kmware.ttk.highway.beans.session.UserSessionBean.httpRequest]

私はそれで何ができますか?

4

2 に答える 2

27

HttpServletRequest のライフサイクルは、CDI コンテナーではなく、EJB/Web コンテナーによって管理されます。これを注入しようとすると問題が発生します。通常、インターフェイスには多くの実装があり、CDI コンテナーには、どの実装を注入するかを決定するための十分な情報がないためです。そのインスタンスの注入に成功したとしても、EJB コンテナーによって管理されているのと同じインスタンスにはなりません。

適切に管理されたリクエストのインスタンスを取得するには、代わりに次のようにします。

@Context
private HttpServletRequest httpRequest;
于 2012-11-16T16:00:41.813 に答える
10

依存関係が JAX-RS (Restful) クラスの場合は、上記の回答に注意してください。一方、依存性注入のより複雑な配置がある場合、質問は確かに有効です。

この機能は CDI 1.1 仕様 (JSR-346) に追加され、これが新しい Java EE 7 仕様に追加されました。つまり、Java Enterprise Application サーバーの最新クラスはこれを処理できるようになります。

それまでの間、実際の HttpServletRequest 情報へのアクセスが必要なリクエスト スコープの依存関係を管理できるようにする必要がある場合は、独自のアプローチを使用してJBoss Solderツールを使用できます。(Web サイトが機能していないように見えてもパニックにならないでください。実際には、作業は公式の CDI 1.1 仕様の実装 (つまり「Weld 2」) に移行したため、はんだの作業はもう行われていません。 CDI 1.0 に完全に適合します。)

Mavenの依存関係は次のようになります

<dependency>
  <groupId>org.jboss.solder</groupId>
  <artifactId>solder-api</artifactId>
  <version>3.2.0.Final</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.jboss.solder</groupId>
  <artifactId>solder-impl</artifactId>
  <version>3.2.0.Final</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>
于 2013-08-26T19:07:57.907 に答える