2017-07-17 10 views
1

これはおそらく愚かな質問ですが、私はJAX RS(およびJersey)に精通していません。JAX RSリソースにBeanを挿入するには?

基本的にRESTfulサービスを開始するスタンドアロンのJavaアプリケーションがありました。リファクタリングの一環として、このアプリケーションを別のアプリケーション内の単なるスレッドに変更しました。その他のアプリケーションは、application-context.xmlに定義されたSpring Beanを使用します。だから、それらのBeanのいくつかをリソースクラスに注入する必要があります(それが正しい名前であれば、@Pathアノテーションを持つものなどです)。問題は、この特定のクラスをどのようにインスタンス化するのか分かりません。 ServletHolderが追加されたServletContexthandlerを持つ(突堤)Serverインスタンスを作成し、ResourceConfigが設定されているレガシーアプリケーションのメインクラスがあります。そんな感じ。

私はSpringからこのメインクラスに自分のものを注入できますが、これらのオブジェクトをJAX RSリソースにどのくらい正確に渡すことができないのか分かりません。

私はかなりシンプルなものを欠場すると確信しています。

編集:私は私の問題と私が以下で見つけた解決策についてより良い説明を追加しました。

+0

も参照してください。https://stackoverflow.com/questions/31099409/how-to-inject-applicationcontext-in-jax-rs –

答えて

3

ジャージーはintegration with Spring supportである。この場合、実行する必要があるのは実際には2つのみです。

  1. 統合の依存関係があることを確認してください。ちょうどあなたの春のコンテキストコンフィギュレーションを含むWebApplicationContextとともにContextLoaderListenerを追加することが

    <dependency> 
        <groupId>org.glassfish.jersey.ext</groupId> 
        <artifactId>jersey-spring4</artifactId> 
    </dependency> 
    <dependency> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
        <version>1.1</version> 
        <exclusions> 
         <exclusion> 
          <groupId>javax.servlet</groupId> 
          <artifactId>servlet-api</artifactId> 
         </exclusion> 
        </exclusions> 
    </dependency> 
    
  2. を文句を言わないように、あなたはまた、コモンズロギングする必要があります。

    ServletContextHandler context 
         = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    AnnotationConfigWebApplicationContext wac 
         = new AnnotationConfigWebApplicationContext(); 
    wac.register(SpringConfig.class); 
    context.addEventListener(new ContextLoaderListener(wac)); 
    

    ここで、SpringConfigは、単に「Java config」Spring構成クラスです。必要に応じて、XMLアプリケーションのコンテキストを使用することもできますが、下のリンクで使用している例ではJavaの設定クラスを使用していますが、XML設定を使用したい場合は簡単にXMLをクラスにインポートする方法を示します。あなたは2つを組み合わせることができます。

これはかなりです。これを設定したら、Spring BeansをJerseyリソースに@Autowiredすることができます。

完全な例については、その基本的には、this GitHub repo

+0

ありがとうございました。これは素晴らしい解決策です!私は別の(より単純な)方法で私の問題を解決することができました(私の問題は最初から正しく説明していないためです)。私は私の解決策を以下に掲示します。 – Evgeni

0

は、たぶん私はよく私の問題を説明することができませんでしたチェックアウトするには、JAX-RSリソースクラスに豆を注入する方法の問題だったときに実際のJAX- RSアプリケーションは、独自のDIメカニズムを介してインスタンス化されているのではなく、他の場所からインスタンス化されています。私の場合、すでにこれらのBeanを作成するSpringコンテナがあり、Spring自身のBeanアプリケーションコンテキストをJAX-RSのものにリンクする簡単な方法はありませんでした。 JAX-RSの@Injectedアノテーションはそれに対応していませんが(少なくともこれは私が読んだことですが)、私たちの既存のSpringソリューションはXMLベースです。ドキュメンテーション)。

ので、JAX-RSは@Injected注釈をサポートし、それからBean定義を得るために知るために、私はResourceConfigのを定義するクラスに移動し、それに次の行を追加する必要がありました:

.register(new AbstractBinder() { 
    @Override 
    protected void configure() { 
     bind(beanImpl1).to(BeanInterface1.class); 
     bind(beanImpl2).to(BeanInterface2.class); 
    } 
}) 

実際のbeanImpl1およびbeanImpl2 Beanインスタンスは、そのクラスのコンストラクタを経由していました。そのクラスのコンストラクタは、SpringからXMLコンフィグレーションを通してインスタンス化されました。

関連する問題