問題タブ [guice-servlet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
165 参照

hibernate - Warp-Persist で Guice をアップグレードする依存関係の問題

warp-servlet および warp-persist で Guice 1.0 を使用するアプリケーションがあり、Guice 2 または 3 にアップグレードしたいと考えています。

warp-persist を新しい Guice で動作させるか、Guice-persist をストレート Hibernate で動作させる簡単な方法 (ドロップイン置換にできるだけ近い) を知っている人はいますか?

  • Warp-persist には warp-servlet が必要です
  • Warp-servlet と warp-persist は Guice 1.0 のみをサポートします
  • Guice-persist は warp-persist に取って代わるように見えますが、JPA のみをサポートしていますが、Hibernate を直接使用しています (JPA への移植を自明ではなくする基準ベースのコードの重要な遺産があります)。
  • Guice-persist は、JPA 以外のデータ アクセスをサポートする方法もあると主張していますが、これに関するドキュメントはないようです。
  • Warp-persist は Hibernate 4 をサポートしていないようです。そのため、Hibernate もアップグレードできません。
0 投票する
1 に答える
3215 参照

java - ガイダンスプロバイダー対EntityManager

永続性とサーブレットの Guice 拡張機能を使用して、Jetty で Guice と JPA を使用して単純な webapp を動作させようとしていました。

私はこの Service 実装クラスを書きました:

}

そして、これは私のサーブレットです(@Singletonで注釈が付けられています):

これを実行すると機能し、名前がクライアントに送信されますが、ログを見ると、挿入用に生成された DML がなく、postgresql から選択しても結果が返されないことがわかります。 t 本当に固執しました。

コードをデバッグしたところ、 がJpaLocalTxnInterceptor呼び出されていることがわかりましたtxn.commit()

次に、変更を加えて、代わりにPersonServiceImpl使用したところ、期待どおりに機能しました。その理由はよくわかりません。おそらく、Provider の背後にある考え方をよく理解していないためです。Guice wiki ページには、次のように書かれています。Provider<EntityManager>EntityManager

MyService を @Singleton にする場合は、代わりに Provider を注入する必要があることに注意してください。

ただし、私の PersonServiceImpl は @Singleton ではないため、なぜそれが適用されるのかわかりません。おそらくサーブレットが原因でしょうか?

これを明確にしていただければ幸いです。

0 投票する
0 に答える
372 参照

junit - JUnit テストで、Jersey エンドポイントのリクエストが、Guice の ServletModule によるフィルターでフィルター処理されない

問題

私は、Jersey を使用して RESTful API に取り組んでいます。単体テストでオブジェクトのモックを作成できるようにするために、依存性注入フレームワーク Guice (特に Guice-Servlet) を使用します。ServletModule の configureServlet() メソッドをオーバーライドして以下を追加することにより、独自の Filter 実装を介してリクエストをフィルタリングすることができます。

Tomcat で webapp を実行すると、この MyFilter クラスでリクエストが正しくフィルタリングされます。しかし、私の JUnit テストでは、どのリクエストもフィルタリングされません。誰でも問題を見つけるのを手伝ってもらえますか?

サンプル コードを含む Bitbucket リポジトリ

  • web / WEB-INF / web.xml : Tomcat によって使用されます。パス '/api/*' で ApplicationSetup を GuiceFilter として定義します。
  • src / main / java / ApplicationSetup.java : 本番環境 (Tomcat Web サーバー) 用の Guice インジェクターを作成します。ServletModules の 1 つとして ApplicationModule を使用します。
  • src / main / java / ApplicationModule.java : パス '/api/*' で MyFilter と Jersey エンドポイントを構成およびバインドする ServletModule。
  • src / main / java / endpoints / HelloWorldEndPoint.java : パス '/api/helloworld' にある単純なエンドポイントで、GET 要求のメソッドを使用します。
  • src / main / java / MyFilter.java : リクエストがこのフィルタを通過した場合、レスポンスに「Via」ヘッダーを設定します。
  • src / test / java / TestApplicationSetup.java : テスト環境 (Grizzly Web サーバー) 用の Guice インジェクターを作成します。ApplicationSetup と同様に、これも ApplicationModule をその ServletModules の 1 つとして使用します。さらに、テスト目的で Grizzly Web サーバーを起動するメソッドがあります。
  • src / test / java / TestHelloWorldEndPoint.java : /api/helloworld で GET 要求を実行し、応答の「Via」ヘッダーが MyFilter に設定されているかどうかを確認します。これは失敗します。

ここでの要点は、フィルタをバインドするために両方の環境で使用される ApplicationModule です。例のログを確認すると、両方の環境で MyFilter が初期化されていることがわかります (init() メソッドでの単純な出力)。また、両方の環境で ApplicationModule がサーブレット構成に使用されていることにも気付くでしょう。しかし、どういうわけか、Grizzly Web サーバーはフィルターを無視します。

私はかなり長い間この問題に苦しんできたので、ここでこの質問をするのに時間がかかりました. 誰かがこれで私を助けてくれることを本当に願っています。回避策も高く評価されます。

0 投票する
0 に答える
229 参照

servlets - Jersey & Guice:各ServletModuleへのベースパスを指定する方法は?

質問: _ _ _

  • ExceptionMapperパスの特定のサブセットに対するリクエストにのみ応答するように、Jersey リソースと を定義するにはどうすればよいですか?
  • 後でホストするベースパスを事前に決定することなく、これを行うにはどうすればよいですか?
  • warそれぞれが Web アプリの特定のベース パスのリソースを定義するライブラリを作成して単一のライブラリを作成できるようにするにはどうすればよいですか?

背景: 2 つの異なる依存関係 ( ) から 2
つの をロードする Guice + Jersey v1 webapp があります。 1 つは残りの API エンドポイントのリソースを定義し (例: ) 、もう 1 つは Web UI のリソースを定義します (例: ) 。 前者の場合、Jersey リソースをベース パス ( ) に関連付けようとしますが、後者の場合は、ベース パス ( ) に対して同等のことを行います。 どちらの依存関係も独自の Jersey を定義します。APIは JSON エラー オブジェクトで応答しますが、Web UIは Freemarker を使用して HTML 応答を生成します。ServletModulejar
@Path("/purchases")@Path("/payment-methods")@Path("/")@Path("/products")
ServletModule"/api/"serve("/api/*").with(GuiceContainer.class, conf);"/"serve("/*").with(GuiceContainer.class, conf);
ExceptionMapperExceptionMapperExceptionMapper

ただし、API と Web UI jar の両方がクラスパス上にあるこの組み合わせの結果は、両方の依存関係からの Jersey リソースが「/api/」と「/」で始まるパスを持つリクエストに応答することです。
たとえば、 の API リソースは/purchasesのリクエストに応答します。同様に、 の Web UI リソースはのリクエストに応答します。http://example.com/api/purchases http://example.com/purchases/productshttp://example.com/products http://example.com/api/products

Jersey がExceptionMapper同じ例外タイプ (例: NotFoundException) に対して 2 つの を認識するという事実により、要求されたパスの開始に関係なく、Jersey は 1 つだけを選択します。私の場合、 はとExceptionMapper<NotFoundException>の両方で未知のリソース リクエストに応答します。これは、アプリのどちらの部分にとっても悪いことです。/api//

0 投票する
1 に答える
2251 参照

java - Guice サーブレットを使用したプロジェクトのテスト: 範囲外の RequestScoped インスタンスをバインドする方法は?

Guice と Guice Servlet 拡張機能を使用してインスタンス化された Java Web アプリケーションがあります。このアプリケーションには、Guice によってインスタンス化される Quartz ジョブも含まれています。これらのジョブの単体テストを書きたいと思います。

ジョブ クラスは、Provider<HttpServletRequest>. get生産的なセットアップでは、ジョブは Guice によって正常にインスタンス化でき、ジョブは期待どおりに機能します。これは、サーブレット リクエスト プロバイダーでをトリガーするコラボレーターのコードを呼び出すことがないためです。getジョブは、サーブレットへの HTTP 要求の一部としてではなく、一部のワーカー スレッドによって実行されるため、このような呼び出しは失敗します。

ここで私の質問は、JUnit テストで Guice をセットアップして同じ動作を得る方法です。つまり、ジョブ クラスをインスタンス化できますが、範囲外の@RequestScopedオブジェクトを使用しようとするとすべて失敗します。


2 つの簡単な解決策がありますが、私にはうまくいきません。

何もバインドしないHttpServletRequestと、テスト セットアップでジョブをインスタンス化しようとするとエラーが発生します。

一方、モックインスタンスをバインドするだけの場合、たとえば

その後、ジョブをインスタンス化できますが、ジョブがサーブレット要求インスタンスを使用する場合にテスト エラーが発生しなくなりました。では、Guice がプロバイダーをインスタンス化できるようにバインディングを作成するにはどうすればよいでしょうか。ただし、プロバイダーの使用は失敗しますか?

0 投票する
1 に答える
1399 参照

java - HTMLファイルに漢字を表示する

サーブレット プログラム内で HTML コードを使用しているサーブレット プログラムが 1 つあります。

コードのデバッグ中に、プロパティ ファイルから漢字を取得しています。しかし、応答がページに送信されると、html ページで疑問符 ????? が表示されます。

英語の文字に問題はなく、正しく表示されています。

0 投票する
1 に答える
705 参照

java - 要求ドメイン (仮想ホスト) に応じて、組み込みの jetty および guice Handler サーブレット

詳細には、複数のリクエストを処理する Java 埋め込みによって単一の jetty サーバーを使用しています。イベント リスナーとセキュリティ フィルターを偽装して注入しています。しかし、ドミアンのリクエストに応じてサーブレットをサーバーする必要があります。仮想ホストを試していますが、xml ベースの構成を使用していないため、参考になるドキュメントがあまりありません。

だから私はしようとしています -

ドメイン abc -> ハンドラ AHandler とフィルタが適用された AFilter の場合、

ドメイン bbc の場合 -> ハンドラー BHandler とフィルターが適用された BFilter。

私のコンテックスの初期化は次のようなものです:

リスナークラス

セキュリティ モジュール:

そして、このようなサーバーで:

AServlet と BServlet は get post put メソッドを持つ通常のサーブレットです。

しかし、私の実装は期待どおりに機能していません。登録された最後のハンドラーにすべての要求を送信します。

必要なことを達成するには、助けが必要です。どこで私は間違ったことをしていますか?

0 投票する
1 に答える
102 参照

mapreduce - HBase MapReduce と google.inject の不一致

Guice 4.0 を利用する社内フレームワークを使用して、HBase テーブルに対して map reduce を実行しようとしています。

糸がバージョン 3.0 を使用しているようで、型の不一致が発生しています。

2016-03-25 08:19:45,784 ERROR [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchMethodError: com.google.inject.multibindings.MultibindingsScanner$1.binder()Lcom/shaded/google/inject/Binder; at com.google.inject.multibindings.MultibindingsScanner$1.configure(MultibindingsScanner.java:53) at com.google.inject.AbstractModule.configure(AbstractModule.java:59) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) at com.google.inject.AbstractModule.install(AbstractModule.java:118) at my.packagename.client.KafkaModule.configure(KafkaModule.java:36) at com.google.inject.AbstractModule.configure(AbstractModule.java:59) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) at com.google.inject.spi.Elements.getElements(Elements.java:101) at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103) at com.google.inject.Guice.createInjector(Guice.java:95) at com.google.inject.Guice.createInjector(Guice.java:72) at com.google.inject.Guice.createInjector(Guice.java:62) at my.packagename.hbase_fix.CleanerMapper.setup(CleanerMapper.java:82) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

同じ作業で、fasterxml と同様の不一致があったため、を使用しmaven-shade-pluginて再配置を成功させましたが、com.google.inject ではあまり成功していません。

<relocations> <relocation> <pattern>com.fasterxml</pattern> <shadedPattern>com.shaded.fasterxml</shadedPattern> <excludes> <exclude>com.fasterxml.*</exclude> </excludes> </relocation> <relocation> <pattern>org.apache.commons.lang</pattern> <shadedPattern>org.shaded.apache.commons.lang</shadedPattern> <excludes> <exclude>org.apache.commons.lang.*</exclude> </excludes> </relocation> <relocation> <pattern>com.google.inject.Binder</pattern> <shadedPattern>com.shaded.google.inject.Binder</shadedPattern> </relocation> <relocation> <pattern>com.google.inject.multibindings</pattern> <shadedPattern>com.shaded.google.inject.multibindings</shadedPattern> </relocation> </relocations>

特に google.inject を使用して MapReduce ジョブでラウンド タイプの不一致を取得する方法に関する提案はありますか?