2017-02-17 6 views
0

私はautowiringによってmessageHandlerの実装を取得するMDBを持っています。 しかし、runtineではこのオブジェクトはnullです。セッターのブレークポイントまで到達したことはありません。 BaseMDBのonMessageメソッド内にブレークポイントを設定すると(次のMDBによって拡張されます)、到達し、messageHandlerオブジェクトがnullであることがわかります。 私はnullpointer例外を取得しています。 なぜ私はオートワイヤリングがうまくいかないと思いますか?次のようにMessageDrivenBeanへのSpringのインジェクションが機能しません - nullポインタ - jboss eap 7

は私のMDBに見えます:

私はSpringBeanAutowiringInterceptorを読んだwhaatからも
@MessageDriven(name = "MyProjectIntern-Bean", activationConfig = { 
                   @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
                  @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/q_myproject_intern") }) 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class MyprojectInternMDB extends BaseMDB implements MessageListener { 

    @Override 
    @Autowired 
    public void setMessageHandler(@Qualifier("myprojectInternalMessageHandler") MessageHandler messageHandler) { 
     this.messageHandler = messageHandler; 
    } 
} 

は、私はクラスパスにbeanRefContext.xmlを持っている必要がありますようにデフォルトのファクトリを使用しています。これは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <bean id="server.context" class="org.springframework.context.support.ClassPathXmlApplicationContext"> 
     <constructor-arg> 
      <list> 
       <value>/container-context.xml</value> 
       <value>/services-context.xml</value> 
       <value>/techcommon-context.xml</value> 
       <value>/container-services-context.xml</value> 
       <value>/container-context-timb.xml</value> 
       <value>/fxp-services-context.xml</value> 
       <value>/stm-services-context.xml</value> 
      </list> 
     </constructor-arg> 
    </bean> 
</beans> 

起動時のJBossコンソールはまた、これらすべてのxmlファイルが言ってbeanRefContext.xmlからロードされていることを私に示しています

Loading XML bean definitions from URL [<pathTobeanRefContext.XML][...] 

は、だから私はそのcorreltyがクラスパス内にあると思います。とりわけコンテナのcontext.xml theresの内

次のエントリ:とりわけコンテナサービス-のcontext.xml theresの内

<context:annotation-config/> 

次の行:

<bean id="internalMessageHandler" class="com.myproject.server.message.InternalMessageHandler"> 
    <qualifier value="myprojectInternalMessageHandler" /> 
</bean> 

だから私のMDBには、指定された修飾子を使用してmessageHandlerを挿入するインターセプターがあります。 MessageHandlerは、注入されるクラスと同じ修飾子とrefererringを持つbeanとして定義されています。 このBeanはxmlファイル内で定義され、xmlファイルはbeanRefContext.xmlによってロードされます。

これ以上何が必要ですか?

多分私の展開にいくつかの言葉。 このファイルには、a)別のjarモジュールとしてのMDB、b)Webアプリケーションを含むwarファイル、c)使用するすべてのライブラリを含むlibフォルダとmeta-inf(注入するmessageHandlerクラスを含む) 。

さらに詳しい情報が必要な場合は、お問い合わせください。 ありがとうございました。

+0

あなたのEJBクラスローダーで利用可能なものは、 " です。アプリケーション(耳プロジェクト)は、いくつかのjarモジュール(スプリングとオートワイヤーも使用します)、ejbモジュール(メッセージ駆動beanを含む)、warモジュールウェブアプリケーション)。 しかし、ドキュメントには "EJB3準拠のインターセプタクラス"と書かれているので、ejbモジュールもサポートされているはずです。 – Kaspatoo

+0

私は本当にソースを持っていませんが、私は戦争プロジェクトが外耳プロジェクト内のすべてのライブラリにアクセスし、独自のアプリケーションコンテキストを初期化できると思います。しかし、イヤーモジュールの直下に配置されたEJBモジュールは、内部ウォーモジュール内に保持されているアプリケーションコンテキストにアクセスすることはできません。私はejbが戦争を見ることができないことを意味します。 グーグルで複数のヒットがあったため、ウォーモジュール上でもコンテキストを共有するのは簡単だったので、この明確な分離は長年にわたり新しいものでなければなりません。 現在、私はejbをwar-moduleに統合していません。 – Kaspatoo

答えて

0

私が見つけ

<module name="test.module" annotations="true" /> 

について説明したものを追加することによって、それを解決:「注:あなたは1つの共有ApplicationContextの定義が複数ある場合は、おそらく問題は春のAPIのドキュメンテーションが言うことである https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/development_guide/class_loading_and_modules#add_an_explicit_module_dependency_to_a_deployment

関連する問題