Spring cloud 如何在QueueMessageHandler中获得SpringCloudAWS的javax.validation有效负载验证?

Spring cloud 如何在QueueMessageHandler中获得SpringCloudAWS的javax.validation有效负载验证?,spring-cloud,spring-cloud-aws,Spring Cloud,Spring Cloud Aws,我正在为AWS SQS编写一些消息消费者,希望通过使用javax.validation.constraints注释来验证收到的消息。 不幸的是,我不得不发现,SpringCloudAWS消息传递依赖项使用的PayloadArgumentResolver使用了NoOpValidator。 所以我尝试为有效负载注入我自己的HandlerMethodArgumentResolver @Bean public QueueMessageHandlerFactory queueMessageHand

我正在为AWS SQS编写一些消息消费者,希望通过使用javax.validation.constraints注释来验证收到的消息。 不幸的是,我不得不发现,SpringCloudAWS消息传递依赖项使用的PayloadArgumentResolver使用了NoOpValidator。 所以我尝试为有效负载注入我自己的HandlerMethodArgumentResolver

  @Bean
  public QueueMessageHandlerFactory queueMessageHandlerFactory(
      final ObjectMapper objectMapper, final Validator hibernateValidator) {
    final MappingJackson2MessageConverter jacksonMessageConverter =
        new MappingJackson2MessageConverter();
    jacksonMessageConverter.setSerializedPayloadClass(String.class);
    jacksonMessageConverter.setStrictContentTypeMatch(true);
    jacksonMessageConverter.setObjectMapper(objectMapper);
    final QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();

    final List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>();
    argumentResolvers.add(new HeaderMethodArgumentResolver(null, null));
    argumentResolvers.add(new HeadersMethodArgumentResolver());

    argumentResolvers.add(new NotificationSubjectArgumentResolver());
    argumentResolvers.add(new AcknowledgmentHandlerMethodArgumentResolver("Acknowledgment"));
    argumentResolvers.add(new VisibilityHandlerMethodArgumentResolver("Visibility"));

    final PayloadArgumentResolver payloadArgumentResolver =
        new PayloadArgumentResolver(jacksonMessageConverter, hibernateValidator);
    argumentResolvers.add(payloadArgumentResolver);

    factory.setArgumentResolvers(argumentResolvers);
    return factory;
  }
@Bean
public QueueMessageHandlerFactory QueueMessageHandlerFactory(
最终对象映射器(最终验证器hibernateValidator){
最终映射Jackson2MessageConverter jacksonMessageConverter=
新的MappingJackson2MessageConverter();
jacksonMessageConverter.setSerializedPayloadClass(String.class);
jacksonMessageConverter.SetStritContentTypeMatch(真);
setObjectMapper(objectMapper);
final QueueMessageHandlerFactory=新的QueueMessageHandlerFactory();
最终列表ArgumentResolver=new ArrayList();
添加(新的HeaderMethodArgumentResolver(null,null));
添加(新标题MethodArgumentResolver());
添加(新的NotificationSubjectArgumentResolver());
添加(新的确认HandlerMethodArgumentResolver(“确认”);
添加(新的VisibilityHandlerMethodArgumentResolver(“可见性”);
最终PayloadArgumentResolver PayloadArgumentResolver=
新的PayloadArgumentResolver(jacksonMessageConverter、hibernateValidator);
ArgumentResolver.add(payloadArgumentResolver);
factory.SetArgumentResolver(ArgumentResolver);
返回工厂;
}
到目前为止还不错,乍一看,效果很好。。。 但正如您所看到的,我还必须添加QueueMessageHandler中已有的参数解析器,以便通过消息的@headers/@Header解析消息头

  @SqsListener(
      value = "queue",
      deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
  public void consume(
      @Payload @Validated final QueueMessage queueMessage,
      @Headers final Map<String,Object> headers) {
  }
@SqsListener(
value=“队列”,
deletionPolicy=SqsMessageDeletionPolicy.ON_成功)
公共消费(
@Payload@Validated final QueueMessage QueueMessage,
@标题(最终地图标题){
}
当我只添加带有hibernate验证程序的PayloadArgumentResolver时,它还将用于解析标题doh


有什么好的解决方案吗?或者我应该在SpringCloudAWS上发布一个问题吗?我只想通过注释验证我的有效负载:(

我不认为这是最好的awswer,但我有一个具有这种验证类型的工作示例项目:

请回答:改进代码格式,包括如何工作的解释以及为什么它是问题的解决方案?请参阅
@Data
@RequiredArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class EventDTO {

  @NotNull(message = "foo is mandatory")
  private final String foo;

  @NotNull(message = "bar is mandatory")
  private final String bar;

}

@Slf4j
@Service
@AllArgsConstructor
public class SampleListener {

  @SqsListener("test_queue")
  public void execute(final @Valid @Payload EventDTO event) {
    log.info("OK: {}", event);
  }

}
@Configuration
public class MessageHandler {
  @Bean
  QueueMessageHandler queueMessageHandler(final AmazonSQSAsync amazonSQSAsync,
      final MessageConverter messageConverter,
      final Validator validator) {
    final QueueMessageHandlerFactory queueMessageHandlerFactory = new QueueMessageHandlerFactory();
    final PayloadMethodArgumentResolver payloadMethodArgumentResolver = new PayloadMethodArgumentResolver(messageConverter, validator);
    queueMessageHandlerFactory.setArgumentResolvers(Collections.singletonList(payloadMethodArgumentResolver));
    queueMessageHandlerFactory.setAmazonSqs(amazonSQSAsync);
    queueMessageHandlerFactory.setMessageConverters(Collections.singletonList(messageConverter));
    return queueMessageHandlerFactory.createQueueMessageHandler();
  }
}