MessageConversionException:无法转换消息内容

问题描述 投票:0回答:4

我的客户班课程如下:

AbsTracteMcrabBitConfiguration.java

@Configuration public abstract class AbstractEMCRabbitConfiguration { //@Value("${emc.rabbit.exchange.core}") protected static String CORE_DATA_EXCHANGE_NAME = "X"; @Value("${emc.rabbit.queue.core.macs}") protected static String MAC_REQUEST_QUEUE_NAME = "data.core.macs"; protected static String MAC_REQUEST_ROUTING_KEY = MAC_REQUEST_QUEUE_NAME; //@Value("${emc.rabbit.hostname}") protected String hostname; //@Value("${emc.rabbit.username}") protected String username; //@Value("${emc.rabbit.password}") protected String password; //@Value("${emc.rabbit.port:5672}") protected Integer port = 5672; protected abstract void configureRabbitTemplate(RabbitTemplate template); @Bean public ConnectionFactory connectionFactory(){ CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); connectionFactory.setUsername("test"); connectionFactory.setPassword("test"); connectionFactory.setPort(port); connectionFactory.setRequestedHeartBeat(60); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate(){ RabbitTemplate template = new RabbitTemplate(connectionFactory()); template.setMessageConverter(jsonMessageConverter()); configureRabbitTemplate(template); return template; } @Bean public MessageConverter jsonMessageConverter() { JsonMessageConverter jsonMessageConverter = new JsonMessageConverter(); jsonMessageConverter.setClassMapper(defaultClassMapper()); return jsonMessageConverter; } @Bean public DefaultClassMapper defaultClassMapper() { DefaultClassMapper defaultClassMapper = new DefaultClassMapper(); defaultClassMapper.setDefaultType(byte.class); return defaultClassMapper; } @Bean public DirectExchange coreDataExchange() { return new DirectExchange(CORE_DATA_EXCHANGE_NAME); } @Bean public AmqpAdmin amqpAdmin() { RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory()); return rabbitAdmin; } } rabbitClientConfiguration.java

@Configuration @Import({JacksonConfiguration.class, MessagingConfiguration.class}) public class RabbitClientConfiguration extends AbstractEMCRabbitConfiguration { @Inject private JacksonConfiguration jacksonConfiguration; @Inject private MessagingConfiguration messagingConfiguration; //@Value("${data.core.pattern}") //private String coreDataRoutingKey; //@Inject //private ClientHandler clientHandler; @Override public void configureRabbitTemplate(RabbitTemplate rabbitTemplate) { rabbitTemplate.setRoutingKey("data.core.macs"); } @Bean public SimpleMessageListenerContainer messageListenerContainer(){ SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory()); container.setQueues(macsDataQueue()); container.setMessageListener(messageListenerAdapter()); container.setAcknowledgeMode(AcknowledgeMode.AUTO); return container; } @Bean MessageListenerAdapter messageListenerAdapter(){ return new MessageListenerAdapter(clientHandler(jacksonConfiguration.objectMapper(),messagingConfiguration.macMessageHandler(messagingConfiguration.messagingFactory())),jsonMessageConverter()); //return new MessageListenerAdapter(clientHandler,"receiveMessage"); } @Bean ClientHandler clientHandler(ObjectMapper objectMapper, IMessageHandler macMessageHandler){ ClientHandler clientHandler = new ClientHandler(); clientHandler.setObjectMapper(objectMapper); clientHandler.setMacMessageHandler(macMessageHandler); return clientHandler; } @Bean public Queue macsDataQueue(){ return rabbitAdmin().declareQueue(); } @Bean public Binding macsDataBinding(){ return BindingBuilder.bind(macsDataQueue()).to(coreDataExchange()).with("data.core.macs"); } @Bean public AmqpAdmin rabbitAdmin() { return new RabbitAdmin(connectionFactory());} }
从经纪人收到的典型消息看起来像:

(正文:'{“ MessagedTolist”:[{“ createDate”:14777396301061,“ message”:“ {\” Mac \ \“: -  99,\”设备\“:444,\” i findEx \“:55,\” ip \“:668,\” arpdevice \“:99,\” aprifindex \“:\” \“ \”,\“ vlanindex \”:111,\ \“ enddevice \” ,,,, “ crudoperation”:“ update”}],“ senderServerid”:“ 5B36A7A1-C17D-471F-B16E-E8E0BF4AFB5B”,“ MESSEDID”:“ 5B 36A7A1-C17D-471F-B16E-E8E0BF4AFB5B20“,“ RebasoftServerType”:“ AC”,“ TaskType”:“ Mac”}'MessageProperties [headers = {},timestamp = null,messageId = null,userId = null,appid = null,clusterId = null,type = null,correlationId = [53,98,51,51,51,51,54,97,97,55,55,55,55,97,49,49,45 ,99、49、55、100、45、52、55、49、102、45、98、49、54, 101、45、101、56、101、48、98、102、52、52、97、97、97、98、53、98、50、48],回复= null,contentType = application/json,contentEncoding = null,contentLength,contentLength,contentLength,contentLength ,fiverymode =持续,有效期= null,Priority = 0,重新列出= false,receedexchange = x, RecterRoutingKey = data.core.macs,veliverTag = 2,messageCount = 0])

注:内容类型是'application/json'

任何帮助我都会感谢。

CASUSET:org.codehaus.jackson.map.jsonmappingexception:无法从start_object token token token token token token token token

spring rabbitmq spring-integration spring-amqp spring-rabbit
4个回答
1
投票
您可以编辑问题并发布消息内容(以及content_type属性以及其他标题)吗? (您可以使用Admin UI检查消息)。

eDit

我在此应用程序中解码您的消息没有问题...

@SpringBootApplication public class So40240771Application { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(So40240771Application.class, args); RabbitTemplate template = context.getBean(RabbitTemplate.class); String body = "{" + "\"messageDTOList\":" + "[{\"createdDate\":1477396301061," + "\"message\":\"{\\\"mac\\\":-99,\\\"device\\\":444,\\\"ifindex\\\":55,\\\"ip\\\":668,\\\"arpdevice\\\":99,\\\"aprifindex\\\":\\\"\\\",\\\"vlanindex\\\":111,\\\"enddevice\\\":133}\"," + "\"crudOperation\":\"UPDATE\"}]," + "\"senderServerId\":\"5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b\"," + "\"messageId\":\"5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b20\"," + "\"rebasoftServerType\":\"AC\"," + "\"taskType\":\"MAC\"" + "}"; MessageProperties properties = new MessageProperties(); properties.setContentType("application/json"); template.send("foo", MessageBuilder.withBody(body.getBytes()).andProperties(properties).build()); Thread.sleep(6000); context.close(); } @Bean public Jackson2JsonMessageConverter converter() { Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); return converter; } @Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); container.setMessageListener(new MessageListenerAdapter(new Object() { void handleMessage(Object in) { System.out.println(in.getClass() + "\n" + in); } }, converter())); container.setQueueNames("foo"); return container; } }

恢复:

class java.util.LinkedHashMap {messageDTOList=[{createdDate=1477396301061, message={"mac":-99,"device":444,"ifindex":55,"ip":668,"arpdevice":99,"aprifindex":"","vlanindex":111,"enddevice":133}, crudOperation=UPDATE}], senderServerId=5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b, messageId=5b36a7a1-c17d-471f-b16e-e8e0bf4afb5b20, rebasoftServerType=AC, taskType=MAC}

一对几件事要注意:由于该消息在标题中没有类型的信息(如果使用的(如果使用)将由出站转换器添加),则将消息解码为简单

Map

如果要解码到对象,则需要标题中的类型信息,或者需要使用类映射器配置转换器(例如
DefaultClassMapper

.

第二,看起来“消息”元素是双重编码的JSON-它已经是JSON,并且已重新编码)。
    

I发现了这个问题,看来我的配置类中的MessageListenerAdapter不喜欢带有构造函数参数的客户端手。一旦我删除了构造函数参数,它可以正常工作。
    

在您的有效载荷/数据类中需要构造函数。

    

完成模型类以实现

Serializable

1
投票

在我的情况下,我需要从IntegrationFlow到MapMessage掩盖MessageBuilder。

0
投票

注 - 我从SimpleConverter中复制了摘要代码,因为我收到的MapMessage。


0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.