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" />

发现于: 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