2016-07-15 6 views
1

私はサービスを提供するカスタムJBoss 7モジュールを持っています(例えば、電子メールの送信にはEmailService)。これらのサービスは、同じASにデプロイされているアプリケーションで使用したいと考えています。CDIを使用してプロデューサメソッドなしでカスタムJBossモジュールを挿入することはできますか?

私はmodule.xmlmodules/jboss/module/mainにあります)のサービスジャーを指定しました。

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.0" name="jboss.module"> 
    <resources> 
    <resource-root path="email-service-api.jar" /> 
    <resource-root path="email-service-impl.jar" /> 
    </resources> 
</module> 

email-service-api.jarには、サービスのインターフェイスのみが含まれています。私はこれをインターフェイスの実装(email-service-impl.jar)とそのサービスを使用するアプリケーションの依存関係として使用します。

email-service-impl.jarにはjboss.module.EmailServiceというファイルがあります(META-INF/servicesフォルダ内)。ファイルには、(これまでのところ、私は1つしかない)すべての私の実装の完全修飾名が含まれています

jboss.module.impl.DefaultEmailService

私は、アプリケーションにサービスを注入したいと思います。

現在、プロデューサメソッドを使用して、 アプリケーションからサービスのインスタンスを取得しています。私はプロデューサメソッドを除外すると

package bean; 

public class Bean { 

    @Inject 
    EmailService emailService; 

    @Produces 
    public EmailService getEmailService() { 
     ServiceLoader<EmailService> emailServices = ServiceLoader.load(EmailService.class); 

     for (EmailService emailService : emailServices) { 
      if (emailService != null) { 
       return emailService; 
      } 
     } 

     return null; 
    } 
} 

私はWELD-001408 Unsatisfied dependencies for type [EmailService] with qualifiers [@Default] at injection point [[field] @Inject bean.Bean.emailService]"}}を言っorg.jboss.weld.exceptions.DeploymentExceptionを取得します。

私は、アプリケーション内のjboss-deployment-structure.xmlファイルがあります:

<jboss-deployment-structure> 
    <deployment> 
    <dependencies> 
     <module name="jboss.module" services="export" /> 
    </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

をそして私は、「実装プロジェクト」(すなわちemail-service-impl.jar)にbeans.xmlファイルを追加しようとしましたが、それは影響を与えませんでした。とにかく例外が発生しました。

サービスを挿入し、CDIを使用してプロデューサメソッドを省略することはできますか?

は、私がコメントで書いたものをまとめると、

デニス

+0

例外は、CDIは「解決」注入点にしようとした結果であり、それはフィールドに注入するための任意の豆を見つけることができません。 プロデューサがヌル以外のものを返すことを確認しようとしましたか?例えば。実際にあなたの実装を見つけることができますか? そうしないと、CDIの観点から設定が有効に見えます。 – Siliarus

+0

ご意見ありがとうございます。これはプロデューサメソッドで適切に動作します。このメソッドは私の実装を見いだします。しかし、私はそれを削除すると、例外がスローされます。 –

+0

ご清聴ありがとうございます。 ATM私は簡単にこれを行う別の方法を考えることができません。しかし、 '@Produces'を使いたくない理由はありますか? – Siliarus

答えて

0

ありがとう:

  • 生産者は、おそらくここに行くための方法です。
    • 最初にロードする必要があるサービスを挿入しようとしています。 CDIは静的な性質を持ち、起動時に利用可能なBeanのみを注入できます。その周りの方法は、プロデューサーを使用することです。
    • さまざまな実装を区別するために、修飾子を使用できます。例えば。各プロデューサーとインジェクションポイントには、指定された修飾子(@DefaultImpl@ProUserなど)があります。
    • あなたのコードを汚染しないように、これらのプロデューサをAPI JARに入れることができます(さらに空を追加するとbeans.xml)。プロデューサー
      • から離れて他の方法については
    • それらはCDIのブーツは、したがって、あなたがBeanとして実装を登録することができますように実行されているので、私はここでしかExtensionと考えることができます。
    • これは、CDI起動時にBeanを利用できるようにするため、プロデューサなしで注入可能です。
    • しかし、この方法ははるかに複雑であることがわかります。
関連する問題