2016-12-07 112 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

相关问题