2016-12-07 144 views
0

我有一個構建於Spring 4.1上的應用程序。我正在嘗試使用XML配置創建JMS Listener並嘗試將傳入的XML消息轉換爲Java對象。下面是我的XML配置:使用Spring JMS時未調用偵聽器方法

<jms:listener-container concurrency="10" 
    connection-factory="connectionFactory" 
    message-converter="marshallingMessageConverter"> 
    <jms:listener destination="destination.name" ref="messageListener" method="processMessage"/> 
</jms:listener-container> 

<bean id="messageListener" class="com.example.CustomMessageListener"> 
</bean> 

<bean id="marshallingMessageConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter"> 
     <property name="marshaller" ref="xmlMarshaller"/> 
     <property name="unmarshaller" ref="xmlMarshaller"/> 
</bean> 

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound" value="com.example.CustomObject"/> 
</bean> 

的Class com.example.CustomMessageListener看上去象下面這樣:

public class CustomMessageListener{ 
    public void processMessage(Message message, CustomObject object){ 
     //Do Something. 
    } 

現在,當我發佈一條消息到目標隊列,在監聽的方法processMessage()是沒有得到所謂的,我我越來越春季日誌下面的錯誤:

Failed to invoke target method 'processMessage' with arguments {[email protected]}; 
nested exception is java.lang.NoSuchMethodException: 
com.example.CustomMessageListener.processMessage(com.example.CustomObject). 

現在,如果我改變Listerner方法的參數,只是接受CustomObjec T,它的工作原理和我從XML正確構造的CustomObject:

public void processMessage(CustomObject, object) 

但我也需要原始javax.jms.Message實例,並根據this文件,應該可以通過在參數,指定要接收該實例名單。

有人可以請幫我在這裏?

+0

是的,它是可能的,但如果你看看這是聽衆不聽者的XML定義的版本的註釋版本的文檔。 –

回答

0

試試這個它應該工作

<jms:listener-container concurrency="10" connection-factory="connectionFactory" > 
    <jms:listener destination="destination.name" ref="defaultMessageListener" /> 
</jms:listener-container> 

<bean id="messageListener" class="com.example.CustomMessageListener"> 
</bean> 

<bean id="marshallingMessageConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter"> 
     <property name="marshaller" ref="xmlMarshaller"/> 
     <property name="unmarshaller" ref="xmlMarshaller"/> 
</bean> 

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound" value="com.example.CustomObject"/> 
</bean> 

<bean id="payloadArgumentResolver" class="org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver"> 
    <property name="converter" ref="marshallingMessageConverter"/> 
</bean> 

<bean id="handlerMethod" class="org.springframework.messaging.handler.invocation.InvocableHandlerMethod"> 
    <constructor-arg 
     ref="messageListener" index="0"/> 
    <constructor-arg 
     value="processMessage" index="1"/> 
    <constructor-arg 
     value="javax.jms.Message" type="java.lang.Class" index="2"/> 
    <constructor-arg 
     value="com.example.CustomObject" type="java.lang.Class" index="3"/> 
    <property name="argumentResolvers" ref="payloadArgumentResolver" /> 
</bean> 

<bean id="defaultMessageListener" class="org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter"> 
    <property name="handlerMethod" ref="handlerMethod" /> 
</bean> 
+0

不是。我得到了同樣的錯誤。我需要使用MessageHandlerMethodFactory嗎?儘管上述文件沒有說明它是強制性的,但有一個提到它。我不知道如何使用它。 – Sudhanva

+0

正如評論中所提到的,文檔是針對'@ JmsListener'而不是XML驅動版本的。 –

+0

@ M.Deinum好的。 [This](http://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/jms.html#jms-namespace)就是我想要遵循的,我也感受到了同樣的效果因爲可以實現註釋。有沒有辦法使用XML配置實現它? – Sudhanva

相關問題