@KafkaListener @Payload 参数验证

从 2.2 版本开始,现在更容易添加一个 Validator 来验证 @KafkaListener @Payload 参数。以前,您必须配置一个自定义的 DefaultMessageHandlerMethodFactory 并将其添加到注册器中。现在,您可以将验证器直接添加到注册器。以下代码展示了如何实现:

@Configuration
@EnableKafka
public class Config implements KafkaListenerConfigurer {

    ...

    @Override
    public void configureKafkaListeners(KafkaListenerEndpointRegistrar registrar) {
      registrar.setValidator(new MyValidator());
    }

}
当您使用带有验证启动器的 Spring Boot 时,会自动配置一个 LocalValidatorFactoryBean,如下例所示:
@Configuration
@EnableKafka
public class Config implements KafkaListenerConfigurer {

    @Autowired
    private LocalValidatorFactoryBean validator;
    ...

    @Override
    public void configureKafkaListeners(KafkaListenerEndpointRegistrar registrar) {
      registrar.setValidator(this.validator);
    }
}

以下示例展示了如何进行验证:

public static class ValidatedClass {

  @Max(10)
  private int bar;

  public int getBar() {
    return this.bar;
  }

  public void setBar(int bar) {
    this.bar = bar;
  }

}
@KafkaListener(id="validated", topics = "annotated35", errorHandler = "validationErrorHandler",
      containerFactory = "kafkaJsonListenerContainerFactory")
public void validatedListener(@Payload @Valid ValidatedClass val) {
    ...
}

@Bean
public KafkaListenerErrorHandler validationErrorHandler() {
    return (m, e) -> {
        ...
    };
}

从 2.5.11 版本开始,类级别监听器中 @KafkaHandler 方法的载荷验证现在也能正常工作。请参阅类级别的 @KafkaListener

从 3.1 版本开始,您可以在 ErrorHandlingDeserializer 中进行验证。有关更多信息,请参阅使用 ErrorHandlingDeserializer