私は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クラスを含む) 。
さらに詳しい情報が必要な場合は、お問い合わせください。 ありがとうございました。
あなたのEJBクラスローダーで利用可能なものは、 " です。アプリケーション(耳プロジェクト)は、いくつかのjarモジュール(スプリングとオートワイヤーも使用します)、ejbモジュール(メッセージ駆動beanを含む)、warモジュールウェブアプリケーション)。 しかし、ドキュメントには "EJB3準拠のインターセプタクラス"と書かれているので、ejbモジュールもサポートされているはずです。 – Kaspatoo
私は本当にソースを持っていませんが、私は戦争プロジェクトが外耳プロジェクト内のすべてのライブラリにアクセスし、独自のアプリケーションコンテキストを初期化できると思います。しかし、イヤーモジュールの直下に配置されたEJBモジュールは、内部ウォーモジュール内に保持されているアプリケーションコンテキストにアクセスすることはできません。私はejbが戦争を見ることができないことを意味します。 グーグルで複数のヒットがあったため、ウォーモジュール上でもコンテキストを共有するのは簡単だったので、この明確な分離は長年にわたり新しいものでなければなりません。 現在、私はejbをwar-moduleに統合していません。 – Kaspatoo