Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7
Posted
技术标签:
【中文标题】Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7【英文标题】:Spring Injection into MessageDrivenBean does not work - null pointer - jboss eap 7 【发布时间】:2017-07-07 07:36:17 【问题描述】:我有一个 MDB,它将通过自动装配获得它的 messageHandler 实现。 但是在运行时这个对象是空的。甚至从未达到设置器处的断点。 当 BaseMDB 的 onMessage 方法中有一个断点时(由下面的 MDB 扩展),它到达并且我可以看到 messageHandler-object 为空。 然后我得到一个空指针异常。 这就是为什么我认为自动装配不起作用。
我的 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 放入类路径中。它看起来如下:
<?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][...]
所以我认为它的相关性在于类路径。
在 container-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。 这个 bean 是在一个 xml 文件中定义的,该文件又通过 beanRefContext.xml 加载。
那么我还需要什么?
也许对我的部署有些话。 有一个 ear-file 包含 a)我的 MDB 作为单独的 jar 模块和 b)一个包含我的 Web 应用程序的 war 文件和 c)包含所有使用的库(包括要注入的 messageHandler 类)的 lib 文件夹和 meta-inf。
如果您需要任何进一步的信息,请直接询问。 感谢您的帮助。
【问题讨论】:
也许问题是 Spring API 文档所说的:“注意:如果您的 EJB 类加载器中有多个共享的 ApplicationContext 定义,您需要”应用程序(一个耳朵项目)拥有一些 jar -modules(也使用 spring 和自动装配)、一个 ejb 模块(包含消息驱动的 bean)和一个 war 模块(包含 webapp)。但是由于文档说“符合 EJB3 的拦截器类”,我认为也应该支持 ejb-modules。 我没有真正的来源,但我认为战争项目可以访问外耳项目中的所有库并初始化它自己的应用程序上下文。但是直接放置在 ear-module 下的 EJB-Module 无法访问现在保存在内部 war-module 中的应用程序上下文。我的意思是ejb不能调查战争。这种清晰的分离多年来一定是新的,因为谷歌上的多次点击表明通过战争模块也很容易共享上下文。目前我无法将 ejb 集成到战争模块中。 【参考方案1】:我通过添加描述的内容解决了它
<module name="test.module" annotations="true" />
发现于: 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
【讨论】:
以上是关于Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7的主要内容,如果未能解决你的问题,请参考以下文章