Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7
Spring Injection into MessageDrivenBean does not work - null pointer - jboss eap 7
我有一个 MDB,它将通过自动装配获得其 messageHandler 实现。
但是在运行时这个对象是空的。即使是 setter 处的断点也从未到达过。
当在 BaseMDB 的 onMessage 方法中有一个断点(由以下 MDB 扩展)时,它被到达并且我可以看到 messageHandler-object 为 null。
然后我得到一个空指针异常。
这就是为什么我认为自动装配不起作用的原因。
我的 MDB 如下所示:
@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;
}
}
据我所知,SpringBeanAutowiringInterceptor 使用默认工厂,因此我需要将 beanRefContext.xml 放入 class 路径。看起来如下:
<?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][...]
所以我认为它的相关性在于 class路径。
容器内-context.xml除其他条目外还有以下条目:
<context:annotation-config/>
在 container-services-context.xml 中有以下行:
<bean id="internalMessageHandler" class="com.myproject.server.message.InternalMessageHandler">
<qualifier value="myprojectInternalMessageHandler" />
</bean>
所以我的 MDB 有一个拦截器,它将使用给定的限定符注入 messageHandler。
MessageHandler 被定义为具有相同限定符的 bean,并指向应注入的 class。
该 bean 在 xml 文件中定义,该文件又通过 beanRefContext.xml.
加载
那么我还需要什么?
也许对我的部署有些话。
有一个 ear 文件包含 a) 我的 MDB 作为单独的 jar 模块和 b) war-文件包含我的 web 应用程序和 c) lib 文件夹和 meta-inf 包含所有使用的库(包括 messageHandler class 待注射)。
如果您需要任何进一步的信息,请直接询问。
感谢您的帮助。
我通过添加
描述的内容解决了这个问题
<module name="test.module" annotations="true" />
我有一个 MDB,它将通过自动装配获得其 messageHandler 实现。 但是在运行时这个对象是空的。即使是 setter 处的断点也从未到达过。 当在 BaseMDB 的 onMessage 方法中有一个断点(由以下 MDB 扩展)时,它被到达并且我可以看到 messageHandler-object 为 null。 然后我得到一个空指针异常。 这就是为什么我认为自动装配不起作用的原因。
我的 MDB 如下所示:
@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;
}
}
据我所知,SpringBeanAutowiringInterceptor 使用默认工厂,因此我需要将 beanRefContext.xml 放入 class 路径。看起来如下:
<?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][...]
所以我认为它的相关性在于 class路径。
容器内-context.xml除其他条目外还有以下条目:
<context:annotation-config/>
在 container-services-context.xml 中有以下行:
<bean id="internalMessageHandler" class="com.myproject.server.message.InternalMessageHandler">
<qualifier value="myprojectInternalMessageHandler" />
</bean>
所以我的 MDB 有一个拦截器,它将使用给定的限定符注入 messageHandler。 MessageHandler 被定义为具有相同限定符的 bean,并指向应注入的 class。 该 bean 在 xml 文件中定义,该文件又通过 beanRefContext.xml.
加载那么我还需要什么?
也许对我的部署有些话。 有一个 ear 文件包含 a) 我的 MDB 作为单独的 jar 模块和 b) war-文件包含我的 web 应用程序和 c) lib 文件夹和 meta-inf 包含所有使用的库(包括 messageHandler class 待注射)。
如果您需要任何进一步的信息,请直接询问。 感谢您的帮助。
我通过添加
描述的内容解决了这个问题<module name="test.module" annotations="true" />