首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QueueMessageHandler中对spring-cloud-aws进行javax.validation有效负载验证?

如何在QueueMessageHandler中对spring-cloud-aws进行javax.validation有效负载验证?
EN

Stack Overflow用户
提问于 2018-07-20 17:05:33
回答 1查看 464关注 0票数 2

我正在为AWS SQS编写一些消息使用者,并希望通过使用javax.validation.constraints注释来验证收到的消息。不幸的是,我不得不找出,spring-cloud-aws-messaging依赖项使用的PayloadArgumentResolver使用了NoOpValidator。所以我尝试为负载注入我自己的HandlerMethodArgumentResolver。

代码语言:javascript
复制
  @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;
  }

到目前为止一切顺利,乍一看,它工作得很好……但正如您所看到的,我还必须添加已存在于QueueMessageHandler中的参数解析器,以通过消息的@ headers /@Header来解析消息头。

代码语言:javascript
复制
  @SqsListener(
      value = "queue",
      deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
  public void consume(
      @Payload @Validated final QueueMessage queueMessage,
      @Headers final Map<String,Object> headers) {
  }

当我只使用hibernate验证器添加我的PayloadArgumentResolver时,它也将用于解析头文件。

有没有什么很好的解决方案,或者我应该在spring-cloud-aws上打开一个问题?我只希望通过注释来验证我的有效负载:(

EN

回答 1

Stack Overflow用户

发布于 2020-12-19 04:37:22

我不认为这是最好的awswer,但我有一个可用的样例项目,它具有这种类型的验证:https://github.com/Haple/sqslistener

代码语言:javascript
复制
@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;

}
代码语言:javascript
复制
@Slf4j
@Service
@AllArgsConstructor
public class SampleListener {

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

}
代码语言:javascript
复制
@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();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51438961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档