sns в aws sqs ошибка преобразования джексона - PullRequest
0 голосов
/ 03 сентября 2018

Ранее я задавал вопрос об отправке сообщений в sqs по темам sns и получил сбой конвертации с использованием Spring Cloud. Это была моя другая попытка использования JMS, и теперь я получаю сообщения о том, что не могу найти свойство _type, когда получатель получает сообщение, любая помощь очень ценится:

Конфигурация SNS:

@Bean
public AmazonSNS snsClient() {

    AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
            .withEndpointConfiguration(<endpoint-stuff>)).build();

    return snsClient;
}

Сообщение производителя:

public void send() throws Exception {

    MessageDto message = new MessageDto();
    message.setMessageA("Hello");
    message.setMessageB("Again");

    String className = message.getClass().getName();

    MessageAttributeValue objectType = new MessageAttributeValue()
            .withDataType("String")
            .withStringValue(className);


    Map<String, MessageAttributeValue> attributes = new HashMap<>();
    attributes.put("_type", objectType);

    String messageAsJson = objectMapper.writeValueAsString(message);

    PublishRequest publishRequest = new PublishRequest()
            .withMessageAttributes(attributes)
            .withTopicArn(topicArn)
            .withMessage(messageAsJson);
       snsClient.publish(publishRequest);
   }

потребительская конфигурация:

    @Bean
public SQSConnectionFactory sqsConnectionFactory() {

    AmazonSQS sqsClient = AmazonSQSClientBuilder
            .standard()
            .withEndpointConfiguration(<endpoint stuff>)
            .build();

   return new SQSConnectionFactory(new 
    ProviderConfiguration(),sqsClient);

}

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(SQSConnectionFactory connectionFactory,
                                                                      MessageConverter messageConverter)
{
    DefaultJmsListenerContainerFactory factory =
            new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setDestinationResolver(new DynamicDestinationResolver());
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    factory.setMessageConverter(messageConverter);
    return factory;
}

@Bean
public MessageConverter messageConverter(ObjectMapper objectMapper) {

    MappingJackson2MessageConverter mappingJackson2MessageConverter = new MappingJackson2MessageConverter();

    mappingJackson2MessageConverter.setObjectMapper(objectMapper);
    mappingJackson2MessageConverter.setTargetType(MessageType.TEXT);
    mappingJackson2MessageConverter.setTypeIdPropertyName("_type");

    Map<String, Class<?>> typeIdMappings = new HashMap<>();
    typeIdMappings.put(MessageDto.class.getName(), MessageDto.class);
    mappingJackson2MessageConverter.setTypeIdMappings(typeIdMappings);

    return mappingJackson2MessageConverter;
}

Потребитель сообщения:

      @JmsListener(destination = "my_queue")
public void onReceive(Message<MessageClass> receivedMsg) throws JMSException {

    LOGGER.info("Message received. Payload: {}, headers: {}", receivedMsg.getPayload(), receivedMsg.getHeaders());
}

Ошибка, которую я получал, была _type не найдена, когда я удалил ее из конфигурации, я получил сообщение о том, что имя свойства не должно быть пустым

...