2017-02-17 86 views
0

我有一個MDB,它將通過自動裝配獲得其messageHandler實現。 但在runtine這個對象是null。即使在二傳手的斷點也沒有達到。 當在BaseMDB的onMessage方法中有一個斷點(由下面的MDB擴展時)到達,我可以看到messageHandler-object爲空。 然後我得到一個空指針異常。 這就是爲什麼我認爲自動裝配不起作用。彈出注入MessageDrivenBean不起作用 - 空指針 - jboss eap 7

我的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; 
    } 
} 

正如從whaat我看過的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][...] 

所以我覺得它的correlty躺在classpath中。

在容器內-context.xml中孤單除其他輸入以下內容:

<context:annotation-config/> 

在容器內的服務-context.xml的孤單除其他下面一行:

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

所以我MDB有一個intercepter,它將使用給定的限定符注入messageHandler。 MessageHandler被定義爲具有相同限定符的bean,並被引用到將被注入的類。 這個bean是在一個xml文件中定義的,該文件又通過beanRefContext.xml加載。

那麼,我還需要什麼?

也許對我的部署有些話。 Theres包含a)我的MDB作爲單獨的jar模塊和b)包含我的web應用程序的戰爭文件和c)包含使用的所有庫的lib文件夾和meta-inf(包括要注入的messageHandler類) 。

如果您需要任何進一步的信息,請直接詢問。 感謝您的幫助。

+0

可能是什麼問題春API單證說:「注意:如果你有一個以上的共享的ApplicationContext定義可以在你的EJB類加載器中使用,你需要「 應用程序(一個ear項目)擁有一些jar模塊(也使用spring和autowiring),一個ejb模塊(包含消息驅動的bean)和一個war模塊Web應用程序)。 但由於文檔中提到「符合EJB3的攔截器類」,我認爲也應該支持ejb-modules。 – Kaspatoo

+0

我沒有真正的源代碼,但我認爲戰爭項目可以訪問外耳項目中的所有庫並初始化它自己的應用程序上下文。但是直接放置在耳朵模塊下的EJB模塊不能訪問現在在內部戰爭模塊中保存的應用上下文。我的意思是ejb不能查看戰爭。 多年來,這種清晰的分離必須是新的,因爲谷歌的多重命中說,在戰爭模塊上共享上下文也很簡單。 目前我無法將ejb整合到war模塊中。 – Kaspatoo

回答