2016-08-25 128 views
0

我嘗試使用Spring AMQP與jackson2JsonMessageConverter進行簡單的發件人和郵件接收。 另外,_TypeId_這裏的意義是什麼 爲什麼它顯示類名稱的發件人包? 我在接收郵件時遇到問題。MessageConversionException:未能解析Spring AMQP中的類名稱

下面是我的配置

org.springframework.amqp.support.converter.MessageConversionException: 未能解決的類名。類未找到 [org.springframework.amqp.helloworld.User] 在org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:121) 在org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper .toJavaType(DefaultJackson2JavaTypeMapper.java:90) 在org.springframework.amqp.support.converter.Jackson2JsonMessageConverter.fromMessage(Jackson2JsonMessageConverter.java:145) 在org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener .java:236) at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:288) at org.springframework.amqp.rabbit.listener.AbstractMes sageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:777) ... 10個共同幀省略了引起:拋出java.lang.ClassNotFoundException: org.springframework.amqp.helloworld.User 在org.apache.catalina.loader.WebappClassLoaderBase.loadClass (WebappClassLoaderBase.java:1305) 在org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139) 在org.springframework.util.ClassUtils.forName(ClassUtils.java:250) 在org.springframework .amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:118) ... 15通用框架省略

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" xmlns:p="http://www.springframework.org/schema/p" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" 
      xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc" 
      xmlns:rabbit="http://www.springframework.org/schema/rabbit" 
      xsi:schemaLocation="http://www.springframework.org/schema/rabbit 
      http://www.springframework.org/schema/rabbit/spring-rabbit.xsd 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
      http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 


      <rabbit:connection-factory id="connectionFactory" 
         channel-cache-size="25" host="10.165.18.29" username="BipUser" 
         password="bip" /> 

      <rabbit:queue name="Job Queue"></rabbit:queue> 

      <rabbit:queue name="Input Queue"></rabbit:queue> 

      <rabbit:queue name="More Info Queue"></rabbit:queue> 

      <rabbit:queue name="Adaptor O/P Queue"></rabbit:queue> 

      <rabbit:queue name="Command Queue"></rabbit:queue> 

      <rabbit:queue name="Error Queue"></rabbit:queue> 

      <bean id="simpleMessageConverter" 
         class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"> 
      </bean> 

      <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" 
         message-converter="jsonConverterWithDefaultType" /> 

      <rabbit:listener-container 
         connection-factory="connectionFactory" auto-declare="true" 
         message-converter="simpleMessageConverter" auto-startup="true" 
         acknowledge="auto"> 
         <rabbit:listener ref="rabbitMQJobListener" 
            queue-names="Job Queue" priority="10" /> 

      </rabbit:listener-container> 

      <rabbit:admin connection-factory="connectionFactory" id="amqpAdmin" /> 

      <bean id="rabbitMQJobListener" class="com.bosch.bip.rabbitmq.consumer.RabbitMQJobListener"> 
      </bean> 

      <rabbit:annotation-driven container-factory="rabbitListenerContainerFactory" /> 

      <bean id="rabbitListenerContainerFactory" 
         class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory"> 
         <property name="connectionFactory" ref="connectionFactory"></property> 
         <property name="messageConverter" ref="jsonConverterWithDefaultType"></property> 
      </bean> 

      <bean id="jsonConverterWithDefaultType" 
         class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"> 
         <property name="classMapper"> 
            <bean class="org.springframework.amqp.support.converter.DefaultClassMapper"> 
            </bean> 
         </property> 
      </bean> 
</beans> 

發件人

package org.springframework.amqp.helloworld; 

import org.springframework.amqp.core.Message; 
import org.springframework.amqp.core.MessageProperties; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.amqp.support.converter.DefaultClassMapper; 
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.stereotype.Component; 

@Component 
public class Sender { 


      public static void main(String[] args) { 

         ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class); 
         User user=new User(); 
         user.setPassword("welcome"); 
         user.setUserName("welcome"); 
         user.setXml("myxml"); 
         RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class); 

         Jackson2JsonMessageConverter converter = context.getBean(Jackson2JsonMessageConverter.class); 
         MessageProperties properties = new MessageProperties(); 
         properties.setHeader("user", "user"); 
         properties.setContentType(MessageProperties.CONTENT_TYPE_JSON); 
         Message message = converter.toMessage(user, properties); 

         System.out.println(message); 



         rabbitTemplate.send(message); 
      } 

      /* @RabbitListener(queues = HelloWorldConfiguration.helloWorldQueueName) 
       public void handleMessage(User user) { 
       System.out.println("User Values::::::::"+user.getPassword()); 
       }*/ 
} 

消費者

package com.bip.rabbitmq.consumer; 

import org.springframework.amqp.rabbit.annotation.EnableRabbit; 
import org.springframework.amqp.rabbit.annotation.RabbitListener; 
import org.springframework.stereotype.Component; 

import com.bip.entity.User; 

@EnableRabbit 
@Component 
public class RabbitMQJobListener { 


      @RabbitListener(queues="Job Queue") 
      public void onMessage(User message) { 
         System.out.println(new String(message.getPassword())); 

      } 
} 

的RabbitMQ

Exchange (AMQP default) 
Routing Key Job Queue 
Redelivered ○ 
Properties 
priority: 0 
delivery_mode: 2 
headers:  
user: user 
__TypeId__: org.springframework.amqp.helloworld.User 
content_encoding: UTF-8 
content_type: application/json 
Payload 
57 bytes 
Encoding: string 
{"userName":"welcome","password":"welcome","xml":"myxml"} 

回答

3

_TypeID_標頭被設置在出站到t ell入站將哪個類轉換爲JSON。如果您想要轉換爲與JSON類型兼容的其他類,則必須配置轉換器。

如果它總是同一個班級,請使用自定義ClassMapper(不是默認值)。

或者,參見this test,其listenerits configuration,以瞭解如何配置不同的typeid映射。

+0

關於下面已刪除的「答案」 - 我答案中的配置鏈接顯示瞭如何將類型id映射到不同的類 - 當然,目標類必須與源類(字段名等)兼容。 'idClassMapping.put(「com.xyz。Foo「,com.abc.Foo.class);' –