Spring - 在 RabbitMQ 侦听器中验证传入消息

Ali*_*Ali 4 java validation spring spring-mvc rabbitmq

我正在使用 Spring Boot 框架。我想通过 RabbitMQ 将一个对象从一个服务发送到另一个服务,如下所示:

服务一:

rabbitTemplate.convertAndSend("queue", createAccountRequestMessage);
Run Code Online (Sandbox Code Playgroud)

服务乙:

@RabbitListener(queues = "queue")
public void onAccountRequested(@Valid CreateAccountRequestMessage createAccountRequestMessage, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG, long tag) throws IOException
{
    
}
Run Code Online (Sandbox Code Playgroud)

CreateAccountRequestMessage课堂上,我定义了一些验证注释,例如@NotEmpty@NotNull等,但是当我从服务 A 向服务 B 发送错误消息时,@Valid注释不起作用并且CreateAccountRequestMessage在调用onAccountRequested方法之前未验证对象。

小智 7

您需要在DefaultMessageHandlerMethodFactory.

@Autowired
SmartValidator validator;

@Bean
public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() {
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
    factory.setValidator(this.validator);
    return factory;
}
Run Code Online (Sandbox Code Playgroud)

然后,您还需要与@Payload注释一起指定 @Valid注释。

@RabbitListener(queues = "queue")
public void onAccountRequested(@Valid @Payload CreateAccountRequestMessage 
    createAccountRequestMessage, Channel channel, 
    @Header(AmqpHeaders.DELIVERY_TAG, long tag) throws IOException
{

}
Run Code Online (Sandbox Code Playgroud)

现在MethodArgumentNotValidException将被抛出并且消息将被丢弃,或者您可以将消息发送到死信交换。