@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 与验证Starters时,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 版本开始,验证现在会在类级监听器中的 0 个方法上生效。
见 @KafkaListener 在类上。
从版本 3.1 开始,你可以在 ErrorHandlingDeserializer 中进行验证。
见 使用 ErrorHandlingDeserializer 以获取更多信息。