ガス - MapBinderのデフォルトのバインディング -- java フィールド と guice フィールド 関連 問題

Guice - Default binding for MapBinder












2
vote

問題

日本語

<コード> MapBinder を使用して、キーをそれぞれの実装にマップしています。今、私はこのようなものがあります:

<事前> <コード> MapBinder<String, Processor> processor = MapBinder.newMapBinder(binder(), String.class, Processor.class); processor.addBinding("a1").to(a1Processor.class).in(Scopes.SINGLETON); processor.addBinding("a2").to(a2Processor.class).in(Scopes.SINGLETON); processor.addBinding("a3").to(a3Processor.class).in(Scopes.SINGLETON);

それが想定されているように機能しています。しかし、<コード> webhook10 <コード> webhook11 以外の webhook11 をこの< webhook12 >を作成することを考えています。コード> webhook14 。これを行うことは可能ですか?

英語

I am using MapBinder to map keys to their respective implementations. Right now I have something like this:

MapBinder<String, Processor> processor                 = MapBinder.newMapBinder(binder(), String.class, Processor.class);         processor.addBinding("a1").to(a1Processor.class).in(Scopes.SINGLETON);         processor.addBinding("a2").to(a2Processor.class).in(Scopes.SINGLETON);         processor.addBinding("a3").to(a3Processor.class).in(Scopes.SINGLETON); 

It is working the way that it is supposed to. But right now I am thinking of creating a DefaultProcessor and binding any String other than a2 and a3 to this DefaultProcessor. Is it possible to do this?

</div
     
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 
javadocs の のof MapBinder

後で注入するためだけに複数のマップエントリを別々にバインドするためのAPI 完全な地図としてそれらを。

だからあなたの質問を求めているのはMapBinderを通して達成することは不可能です。

Map<String, Processor> の周囲にラッパーを書いて、それを使用することができます。

提案:

<事前> <コード> @Singleton class StringProcessorWrapper { private final Map<String, Processor> processorMap; private final Processor defaultProcessor; @Inject public StringProcessorWrapper(Map<String, Processor> processorMap, @Named("default") Processor defaultProcessor) { this.processorMap = processorMap; this.defaultProcessor = defaultProcessor; } public Processor get(String key) { return processorMap.getOrDefault(key, defaultProcessor); } }

この作業には、Guice Moduleの<コード> configure

メソッドにバインディングを追加する必要があります。 <事前> <コード> bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);

StringProcessor ラッパーを注入して使用することができます。

この提案は、 Map をたくさんの場所で使用する必要がある場合に貴重です。単一のクラスの場合は、デフォルトを注入してキーが見つからないときに使用することができます。

マップを使用して別のデフォルトバインディングを追加したくない場合は、 "default" キーと get メソッドでMapBinderに4番目のバインディングを追加できます。 StringProcessorWrapper このようなことを行います。

<事前> <コード> Map<String, Processor>0
 

From the Javadocs of MapBinder

An API to bind multiple map entries separately, only to later inject them as a complete map.

So what you are asking in your question is not possible to achieve via MapBinder.

Although you can write a wrapper around the Map<String, Processor> and use it.

Suggestion:

@Singleton class StringProcessorWrapper {      private final Map<String, Processor> processorMap;     private final Processor defaultProcessor;      @Inject     public StringProcessorWrapper(Map<String, Processor> processorMap, @Named("default") Processor defaultProcessor) {         this.processorMap = processorMap;         this.defaultProcessor = defaultProcessor;     }      public Processor get(String key) {         return processorMap.getOrDefault(key, defaultProcessor);     } } 

For this to work you will have to add a binding in your guice module's configure method like this:

bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON); 

Now you can inject the StringProcessor wrapper and use it.

This suggestion is valueable when you need to use the Map at a lot of places. For a single class, you can just inject the default and use it when key is missing.

If you just want to use the map and avoid adding a separate default binding, you can add a 4th binding in your MapBinder with "default" key and in the get method of StringProcessorWrapper do something like this:

processorMap.getOrDefault(key, processorMap.get("default")); 
</div
 
 
         
         

関連する質問

0  ガサを引っ込めたサードパーティのBeanを注射しました  ( Retrieve guice injected 3rd party bean ) 
私はForgerockのOpenamを使っていて、私のコードから彼らのユーティリティの1つを呼び出したいと思います。クラスは次のように定義されています。 <事前> <コード> @Singleton public class SessionMaxStats im...

2  Framework Guice Despendency Encluding ProvisionERRORを再生する  ( Play framework guice dependency injection provisionerror ) 
こののように構築されたクラスを持っています <事前> <コード> class CryptoManager @Inject()(config: Configuration) { Security.addProvider(new org.bouncycast...

14  Tomcat / Wicket / Hibernateプロジェクトのために春やガスを使うべきですか?  ( Should i use spring or guice for a tomcat wicket hibernate project ) 
Linux、Apache、Tomcat、Wicket、JPA / Hibernate、およびMySQLを使用する新しいWebアプリケーションを構築しています。私の主な必要性は依存的な注射であり、春とガスの両方がうまくいく可能性があります。私は春とjtaが付属...

6  NoClassDeffoundError:guicebletContextListener + EclipseからGWT + GAEを実行するとき  ( Noclassdeffounderror guiceservletcontextlistener when running gwt gae from ec ) 
プロジェクトをEclipseからWebアプリケーションとして実行しようとすると、次のエラーがあります。 <事前> <コード> [WARN] failed com.google.apphosting.utils.jetty.DevAppEngineWebAppC...

0  JASYPT、Package-info.javaに関する問題  ( Problems with jasypt package info java ) 
Guice、Jasypt、GWT + Jetty ServerでJPAを使用しています。 暗号化列にカスタムタイプを作成しようとしています。 私はカスタムタイプを持っているpackage-info.javaを作成しました。 package-info.java...

36  誰かがGoogle Guiceが有用である理由の明確な説明を提供できますか?  ( Can anyone provide a clear explanation of why google guice is useful ) 
私はGoogle Guiceについて読んで、依存性注入への他のアプローチに関する一般的な問題を理解していますが、私はその価値が明確になるガス「実際に」を使っている誰かの例をまだ見ていません。 誰かがそのような例を認識しているのか疑問に思う? ...

0  特定のパラメータをカスタムアノテーションのインスタンスにバインドするにはどうすればよいですか。  ( How do i bind a specific parameter to an instance of a custom annotation ) 
ガスを使って以下の作業をするにはどうすればよいですか? <事前> <コード> // The Guice Module configuration void configure() { // The following won't compile becau...

7  ガスバインディング構成を整理するための解決策  ( Solutions to organize guice binding configurations ) 
明らかに、すべてのバインディングを1つのモジュールに入れるのが悪い考えであるので、あなたはより優雅な方法だと思いますか? 私はボブの考えがこの議論のために良いスタートかもしれないと思います: この種のもののためのすべての規則を占めていますが、パッケージごとに...

1  Guiceを使用してJooq構成を注入する  ( Injecting jooq configuration using guice ) 
ドロップウィザードプロジェクトでJooqを広く使用し、ガスを使用してサービスクラスに設定を注入する方法があるかどうかを知りたがっています。 Guice Setupの更新 <事前> <コード> public class SystemModule extends...

1  最初のRPC(GWTとガス)の遅れ、MVPパターン  ( Delay on first rpc gwt and guice mvp pattern ) 
GWTのガス(MVP)を使用しています。そのことについてもっと知りたいことは、最初のRPCがもう少し時間を取得する理由です。ガス注射のようですが30秒のタイムアウトがあります。 次のRPCが30秒で行動した場合、遅延はありませんが、30秒後にRPCが到着し...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有