2016-08-17 1 views
0

まず第一に、これは疑念のある質問ではなく、ほとんどの関連する質問をSOで読みました。私は以下のソリューションが正しいアプローチ/方法であるかどうかをアドバイスしたいと思っています。CDIとジャージーとの抽象的な拘束の有無を問わずに

私はjersey-based WebアプリケーションでDIを実装する方法の多くのチュートリアルを読んでいると、それらのほとんどは、その必須のCDIを有効にするためにWEB-INF/*beans.xmlを作成することをお勧めしますが、ジャージーのAbstractBinderを使用して、同じ結果を得る場合、私は疑問に思います?

私は従う

public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     AbstractBinder binder = new AbstractBinder() { 
      @Override 
      protected void configure() {      
       bind(Impl.class).to(Interface.class).in(Singleton.class); 
      } 
     }; 
     register(binder); 
     register(MultiPartFeature.class); 
     packages("..."); //packages 
    } 
} 

としてweb.xml

<servlet> 
    <servlet-name>Test Jersey</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 

    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.test.config.AppConfig</param-value> 
    </init-param> 

そしてcom.test.config.AppConfigで、次のいジャージーWebアプリケーションを持っているし、私は、インタフェースに注釈を付けると実装が

@Inject 
private SomeInterface someInterface; 
を注入します

上記はうまく動作します。私が注入したいものが何であれ、binderにそれを含めてから、injection pointと指定して注射します。

そこにはbeans.xmlWEB-INF/内のディレクトリはありませんし、beans.xmlを宣言する必要がなくなりResourceConfig拡張AppConfig内部AbstractBinderを使用しているのだろうか?

を追加すると、@Componentまたは@ManagedBeanのクラスに注釈を付けるときに、DIの道を開くクラスがスキャンされる可能性があります。なぜなら....

かかわらず、私は、ジャージーでのDIのための既存のソリューション(上図)と

  1. するかどうかのスティック上のご意見/助言/アドバイス/提案を聞いて幸せだろうか?
  2. アノテーションクラス(注入する必要がある)に切り替えて、beans.xmlのアノテーション検出を使用しています...なぜですか?
  3. ジャージーはデフォルトでHK2を使用します。別のDI コンテナを使用する価値がありますか、またはHK2で十分ですか?
  4. JavaEE 6 DIIと比較して、JerseyのSpring DIについてのあなたの見解は?

TomcatではCDIがサポートされていないことを示すチュートリアルはたくさんありますか?上記ではAbstractBinderを使用していましたが、私はプログラムでバインドしていると思いますか?コメント。

答えて

0

私は明確な回答がなく、正しいものが存在しない可能性があります。少なくともWeld SE support was introduced in version 2.15 of Jerseyとこれは確かに何の理由もありません。しかし、私はそれを試してみることにしたいと思います:

  1. 示した解決策は、非複雑なプロジェクト構造のため正常に動作しますが、すべて単一の結合を宣言すると、あなたはbeans.xmlを使用する必要はありません最善の解決策
  2. ではないかもしれません。注釈と自動バインディングは、いくつかの追加の労力でうまく動作します(下記参照)
  3. 私はこれについてはわかりませんが、Weldはより進んだようです。もちろん、CDIといくつかの作業を混在させることもできます。
  4. ここで(ここでは応答なし)

私は面白いかもしれないと思うたとえば、:

依存関係(Mavenの):

<dependency> 
    <groupId>org.glassfish.hk2</groupId> 
    <artifactId>hk2-metadata-generator</artifactId> 
    <version>2.5.0-b05</version> <!-- HK2 version int. used by Jersey 2.23.2 --> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet</artifactId> 
</dependency> 

アプリケーションイベントリスナー:

import org.glassfish.hk2.api.*; 
import org.glassfish.jersey.server.*; 

@Provider 
public class ApplicationListener implements ApplicationEventListener { 

    @Inject ServiceLocator serviceLocator; 

    @Override 
    public void onEvent(ApplicationEvent event) { 
     switch (event.getType()) { 
     case INITIALIZATION_FINISHED: 
      onInitFinished(); 
      break; 
     case DESTROY_FINISHED: 
     case INITIALIZATION_APP_FINISHED: 
     case INITIALIZATION_START: 
     case RELOAD_FINISHED: 
     default: 
      break; 
     } 
    } 

    @Override 
    public RequestEventListener onRequest(RequestEvent requestEvent) { return null; } 

    public void onInitFinished() { 
     populate(serviceLocator); 
    } 

    private void populate(ServiceLocator serviceLocator) { 
     DynamicConfigurationService dcs = serviceLocator.getService(DynamicConfigurationService.class); 
     Populator populator = dcs.getPopulator(); 
     try { 
      populator.populate(); 
     } catch (IOException | MultiException e) { 
      throw new MultiException(e); 
     } 
    } 
} 

契約:

import org.jvnet.hk2.annotations.Contract; 

@Contract 
public interface ExampleService { 
    void executeSomething(); 
} 

つ以上のサービス:

import javax.inject.Named; 
import org.jvnet.hk2.annotations.Service; 

@Service 
@Named("bar") 
public class BarService implements ExampleService { 

    @Override 
    public void executeSomething() { /* doBar */ } 

} 

使用法:(私は使ったことがないか見てきました)beans.xmlを取り除くために

@Path("/") 
public class TestResource { 

    // either ... 
    @Inject 
    @Named("bar") 
    private ExampleService bar; 

    // or ... 
    @Inject 
    private IterableProvider<ExampleService> services; 

} 

ジャストオプションまたはResourceConfigの宣言がありますが、利害関係者を見つけるかもしれません:)

Addiが来ているようです^^

素敵な一日を!

関連する問題