我正在为AWS SQS编写一些消息使用者,并希望通过使用javax.validation.constraints注释来验证收到的消息。不幸的是,我不得不找出,spring-cloud-aws-messaging依赖项使用的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;
}到目前为止一切顺利,乍一看,它工作得很好……但正如您所看到的,我还必须添加已存在于QueueMessageHandler中的参数解析器,以通过消息的@ headers /@Header来解析消息头。
@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上打开一个问题?我只希望通过注释来验证我的有效负载:(
发布于 2020-12-19 04:37:22
我不认为这是最好的awswer,但我有一个可用的样例项目,它具有这种类型的验证:https://github.com/Haple/sqslistener
@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();
}
}https://stackoverflow.com/questions/51438961
复制相似问题