1

の変換に失敗しました。現時点では、私はJavaConfigクラスを使用してそれの受信側を実装しています。しかし、私はMessageConversionExceptionを受け取りました、そして、メッセージはメッセージを処理するために私のClientHandlerクラスに到達していません。ここではインシデントのコンソールログは、次のとおりです。MessageConversionException:私は春AMQPを利用しSpringBootアプリケーションを持っているメッセージの内容

Caused by: org.springframework.amqp.support.converter.MessageConversionException: Failed to  convert Message content 
    at org.springframework.amqp.support.converter.JsonMessageConverter.fromMessage(JsonMessageConverter.java:105) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener.java:185) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:243) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:756) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    ... 10 common frames omitted 
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of byte out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1] 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer._parseByte(StdDeserializer.java:214) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$ByteDeserializer.deserialize(StdDeserializer.java:749) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$ByteDeserializer.deserialize(StdDeserializer.java:736) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1877) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.springframework.amqp.support.converter.JsonMessageConverter.convertBytesToObject(JsonMessageConverter.java:131) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.support.converter.JsonMessageConverter.fromMessage(JsonMessageConverter.java:100) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    ... 13 common frames omitted 
2016-10-25 12:51:42,020 WARN t:[SimpleAsyncTaskExecutor-1] ConditionalRejectingErrorHandler: Fatal message conversion error; message rejected; it will be dropped or routed to a dead letter exchange, if so configured: (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 [headers={}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=[53, 98, 51, 54, 97, 55, 97, 49, 45, 99, 49, 55, 100, 45, 52, 55, 49, 102, 45, 98, 49, 54, 101, 45, 101, 56, 101, 48, 98, 102, 52, 97, 102, 98, 53, 98, 50, 48], replyTo=null, contentType=application/json, contentEncoding=null, contentLength=0, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=X, receivedRoutingKey=data.core.macs, deliveryTag=2, messageCount=0]) 
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:864) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:759) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:679) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:83) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:170) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1253) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:660) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1021) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1005) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:83) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1115) [spring-rabbit-1.4.6.RELEASE.jar:na] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_51] 
Caused by: org.springframework.amqp.support.converter.MessageConversionException: Failed to convert Message content 
    at org.springframework.amqp.support.converter.JsonMessageConverter.fromMessage(JsonMessageConverter.java:105) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener.java:185) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:243) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:756) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 
    ... 10 common frames omitted 
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of byte out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1] 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer._parseByte(StdDeserializer.java:214) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$ByteDeserializer.deserialize(StdDeserializer.java:749) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$ByteDeserializer.deserialize(StdDeserializer.java:736) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1877) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] 
    at org.springframework.amqp.support.converter.JsonMessageConverter.convertBytesToObject(JsonMessageConverter.java:131) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    at org.springframework.amqp.support.converter.JsonMessageConverter.fromMessage(JsonMessageConverter.java:100) ~[spring-amqp-1.4.6.RELEASE.jar:na] 
    ... 13 common frames omitted 

は私のクライアント・クラスは以下の通りです:

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());} 

} 

典型的なbrから受信したメッセージokerは次のようになります。

(本体: '{ "messageDTOList":[{ "CreatedDateに":1477396301061、 "メッセージ": "{\" MAC \ ": - 99、\" デバイス\ ": 44、 "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"メッセージID = null、messageId = null、userId = null、appId = null、clusterId = null、type = null、correlationId = [53、配列番号98、配列番号51、配列番号54、配列番号97、配列番号55、配列番号97、配列番号49、配列番号45、配列番号99、配列番号49、 replyTo = null、contentType =アプリケーション/ json、contentEncoding = null、contentLength = 0、deliveryMode = PERSISTENT、expiration = null 、プレオrity = 0、再配信=偽、receivedExchange = X、receivedRoutingKey = data.core.macs、deliveryTag = 2、MessageCountこの= 0])

注:コンテンツタイプが 'アプリケーション/ JSON' である

どんな助けでも大変感謝しています。

によって引き起こさ

答えて

0

:org.codehaus.jackson.map.JsonMappingException:START_OBJECTのうち、バイトのインスタンスをデシリアライズすることはできませんトークン

は、ガベージメッセージのように見える - あなたはそれがウサギによって作成されたことを確認していますjsonコンバータのテンプレート?

あなたは質問を編集して、メッセージの内容(およびCONTENT_TYPE特性、および他のヘッダ)を投稿することができますか? (管理UIを使用してメッセージを調べることができます)。

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} 

注意すべき物事のカップル:メッセージ以来、私は...

@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; 
    } 

} 

の検索結果を何の問題は、このアプリを使ってメッセージを解読しなかった

EDIT

ヘッダーに型情報がありません(アウトバウンドコンバータが使用されている場合はアウトバウンドコンバータによって追加されます)。メッセージは単純なにデコードされます。

オブジェクトにデコードしたい場合は、どちらかがヘッダー内の型情報を必要とする、またはこのようなDefaultClassMapperとしてクラスマッパー(とコンバータを設定する必要があります。

第二に、それは次のようになります"message"要素はダブルエンコードされたJSONです - 既にJSONで再エンコードされています)。

+0

ゲーリーを元通りにしてくれてありがとう。私は質問に上記の情報を追加しました。 –

+0

私はそれを解読するのに苦労しなかった。私の編集を参照してください。 –

+0

プロバイダ側のコードはjavaで書かれていますので、単純なマップとして受け付けても構いません。私はコードごとにDefaultClassMapperを使用しようとしましたが、無駄です。私は非春のプロデューサーが春の消費者に必須のヘッダー情報を提供する必要があるかどうか疑問に思っていましたか? –

0

私の問題は、構成クラスのMessageListenerAdapterがコンストラクター引数を持つClientHandlerを好まないことがわかりました。コンストラクタの引数を削除するとうまく動作します。

関連する問題