весеннее облако aws обмен сообщениями sqs сериализует localdatetime как строку

#amazon-web-services #cloud #amazon-sqs #spring-cloud-aws

Вопрос:

Я использую spring cloud starter для обмена сообщениями aws

 implementation 'io.awspring.cloud:spring-cloud-starter-aws'
implementation 'io.awspring.cloud:spring-cloud-starter-aws-messaging'
 

версия

 set('springCloudAwsVersion', '2.3.1')

dependencyManagement {
    imports {
        mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsVersion}"
    }
}
 

мои бобы конфигурации

 @Bean
  public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs) {
    return new QueueMessagingTemplate(amazonSqs);
  }

  @Bean
  public AmazonSQSAsync amazonSqs() {
    return AmazonSQSAsyncClientBuilder.standard()
        .build();
  }

  @Bean
  public ObjectMapper messageConverter() {
    return new ObjectMapper().findAndRegisterModules();
  }

  @Bean
  public MappingJackson2MessageConverter mappingJackson2MessageConverter(final ObjectMapper objectMapper) {
    final var jacksonMessageConverter = new MappingJackson2MessageConverter();
    jacksonMessageConverter.setObjectMapper(objectMapper);
    jacksonMessageConverter.setSerializedPayloadClass(String.class);
    jacksonMessageConverter.setStrictContentTypeMatch(false);
    return jacksonMessageConverter;
  }

  @Bean
  public QueueMessageHandlerFactory queueMessageHandlerFactory(final MappingJackson2MessageConverter messageConverter) {
    final var factory = new QueueMessageHandlerFactory();
    factory.setArgumentResolvers(List.of(new PayloadMethodArgumentResolver(messageConverter)));
    return factory;
  }

  @Bean
  public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(final AmazonSQSAsync amazonSqs) {
    final var factory = new SimpleMessageListenerContainerFactory();
    factory.setAmazonSqs(amazonSqs);
    factory.setMaxNumberOfMessages(1);
    return factory;
  }
 

проблема, когда я @inject QueueMessagingTemplate и использую метод sendAndConvert, все поле времени java8 моего POJO преобразуется как с отдельными полями минутные часы и т. Д… объект, а не строка.
Поэтому, когда я пытаюсь десериализовать свой картограф объектов, возникает исключение

Я пытаюсь зарегистрировать QueueMessagingTemplate с помощью GroupIdResolver(как null) и того же преобразователя 2jacksonconverter, но в результате asyncClient перестает подключаться к очереди

Ответ №1:

В моем случае проблема, решенная с созданием очереди FIFO с идентификатором группы и идентификатором дедупликации, также добавила map2jackson в queuTemplate

 @Bean
  public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs) {
    return new QueueMessagingTemplate(amazonSqs, (ResourceIdResolver) null, mappingJackson2MessageConverter(messageConverter()));
  }