验证 Spring 个 Kafka 负载
Validating Spring Kafka payloads
我正在尝试设置一个同时具有 REST (POST) 端点和 Kafka 端点的服务,这两个端点都应该采用请求对象的 JSON 表示(让我们调用它 Foo)。我想确保 Foo 对象是有效的(通过 JSR-303 或其他)。所以 Foo 可能看起来像:
public class Foo {
@Max(10)
private int bar;
// Getter and setter boilerplate
}
设置 REST 端点很简单:
@PostMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> restEndpoint(@Valid @RequestBody Foo foo) {
// Do stuff here
}
如果我 POST,{ "bar": 9 }
它处理请求,但如果我 post: { "bar": 99 }
我得到一个错误的请求。目前一切顺利!
Kafka 端点很容易创建(同时添加 StringJsonMessageConverter()
到我的 KafkaListenerContainerFactory
以便我得到 JSON->Object conversion:
@KafkaListener(topics = "fooTopic")
public void kafkaEndpoint(@Valid @Payload Foo foo) {
// I shouldn't get here with an invalid object!!!
logger.debug("Successfully processed the object" + foo);
// But just to make sure, let's see if hand-validating it works
Validator validator = localValidatorFactoryBean.getValidator();
Set<ConstraintViolation<SlackMessage>> errors = validator.validate(foo);
if (errors.size() > 0) {
logger.debug("But there were validation errors!" + errors);
}
}
但无论我尝试什么,我仍然可以传递无效的请求,并且它们处理无误。
@Valid
和 @Validated
我都试过了。我试过添加一个 MethodValidationPostProcessor
bean。我试过向 KafkaListenerEndpointRegistrar 添加一个验证器(一个 EnableKafka javadoc):
@Configuration
public class MiscellaneousConfiguration implements KafkaListenerConfigurer {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
LocalValidatorFactoryBean validatorFactory;
@Override
public void configureKafkaListeners(KafkaListenerEndpointRegistrar registrar) {
logger.debug("Configuring " + registrar);
registrar.setMessageHandlerMethodFactory(kafkaHandlerMethodFactory());
}
@Bean
public MessageHandlerMethodFactory kafkaHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setValidator(validatorFactory);
return factory;
}
}
我已经在这上面花了几天时间,运行 没有其他想法了。这甚至可能吗(无需将验证写入我的每个 kakfa 端点)?
抱歉耽搁了;本周我们在 SpringOne 平台。
基础架构当前不会将 Validator
传递到有效负载参数解析器。请开一个issue on GitHub.
Spring kafka 侦听器默认不扫描非 Rest 控制器的 @Valid 类。更多详情请参考这个答案
我正在尝试设置一个同时具有 REST (POST) 端点和 Kafka 端点的服务,这两个端点都应该采用请求对象的 JSON 表示(让我们调用它 Foo)。我想确保 Foo 对象是有效的(通过 JSR-303 或其他)。所以 Foo 可能看起来像:
public class Foo {
@Max(10)
private int bar;
// Getter and setter boilerplate
}
设置 REST 端点很简单:
@PostMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> restEndpoint(@Valid @RequestBody Foo foo) {
// Do stuff here
}
如果我 POST,{ "bar": 9 }
它处理请求,但如果我 post: { "bar": 99 }
我得到一个错误的请求。目前一切顺利!
Kafka 端点很容易创建(同时添加 StringJsonMessageConverter()
到我的 KafkaListenerContainerFactory
以便我得到 JSON->Object conversion:
@KafkaListener(topics = "fooTopic")
public void kafkaEndpoint(@Valid @Payload Foo foo) {
// I shouldn't get here with an invalid object!!!
logger.debug("Successfully processed the object" + foo);
// But just to make sure, let's see if hand-validating it works
Validator validator = localValidatorFactoryBean.getValidator();
Set<ConstraintViolation<SlackMessage>> errors = validator.validate(foo);
if (errors.size() > 0) {
logger.debug("But there were validation errors!" + errors);
}
}
但无论我尝试什么,我仍然可以传递无效的请求,并且它们处理无误。
@Valid
和 @Validated
我都试过了。我试过添加一个 MethodValidationPostProcessor
bean。我试过向 KafkaListenerEndpointRegistrar 添加一个验证器(一个 EnableKafka javadoc):
@Configuration
public class MiscellaneousConfiguration implements KafkaListenerConfigurer {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
LocalValidatorFactoryBean validatorFactory;
@Override
public void configureKafkaListeners(KafkaListenerEndpointRegistrar registrar) {
logger.debug("Configuring " + registrar);
registrar.setMessageHandlerMethodFactory(kafkaHandlerMethodFactory());
}
@Bean
public MessageHandlerMethodFactory kafkaHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setValidator(validatorFactory);
return factory;
}
}
我已经在这上面花了几天时间,运行 没有其他想法了。这甚至可能吗(无需将验证写入我的每个 kakfa 端点)?
抱歉耽搁了;本周我们在 SpringOne 平台。
基础架构当前不会将 Validator
传递到有效负载参数解析器。请开一个issue on GitHub.
Spring kafka 侦听器默认不扫描非 Rest 控制器的 @Valid 类。更多详情请参考这个答案