使用Sping Boot 框架我想通过RabbitMQ将一个对象从一个服务发送到另一个服务,如下所示:
服务A:
rabbitTemplate.convertAndSend("queue", createAccountRequestMessage);
服务B:
@RabbitListener(queues = "queue")
public void onAccountRequested(@Valid CreateAccountRequestMessage createAccountRequestMessage, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG, long tag) throws IOException
{
}
在CreateAccountRequestMessage
类中,我定义了一些验证注解,如@NotEmpty
,@NotNull
等,但是当我从服务A向服务B发送错误消息时,@Valid
注解不起作用,并且在调用onAccountRequested
方法之前没有验证CreateAccountRequestMessage
对象。
3条答案
按热度按时间t3psigkw1#
您需要在
DefaultMessageHandlerMethodFactory
中设置验证器。然后还需要指定
@Payload
注解沿着@Valid
注解。现在
MethodArgumentNotValidException
将被抛出,消息将被丢弃,或者您可以将消息发送到死信交换。eblbsuwk2#
我也有同样的问题。@Praveer的答案除了SmartValidator之外效果都很好。我在这里发布我的解决方案,它的灵感来自这篇文章https://blog.trifork.com/2016/02/29/spring-amqp-payload-validation/
x9ybnkn63#
我也有类似的问题。
我的信息是这样定义的:
我在适当的队列上发送了如下消息:
我给听众下了这样的定义:
未验证ValidatedBook对象,消息始终通过验证。
我检查了验证是否应该通过手动编写的验证抛出异常:
当name为空或null时,Book就是无效的,而
@Valid
什么也没做!Solution我的问题是在类级别添加额外的注解
@Validated
:现在应该失败的消息-使用ConstraintViolationException(不输入方法)失败,我可以很容易地在
ErrorHandler
类(* implements RabbitListenerErrorHandler
)中捕获异常。