Я пытаюсь настроить службу, которая имеет как конечную точку 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 }
, он обрабатывает запрос, но если я отправлю:{ "bar": 99 }
Я получаю плохой запрос.Пока все хорошо!
Конечную точку Kafka легко создать (наряду с добавлением StringJsonMessageConverter()
к моему KafkaListenerContainerFactory
, так что я получаю преобразование JSON-> Object:
@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
.Я попытался добавить Validator в KafkaListenerEndpointRegistrar (в виде javadoc EnableKafka):
@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;
}
}
Я потратил на это несколько дней, и у меня заканчиваются другие идеи.даже возможно (без записи проверки в каждую из моих конечных точек какфа)?