Проверка полезных нагрузок Spring Kafka - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь настроить службу, которая имеет как конечную точку 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;
    }
}

Я потратил на это несколько дней, и у меня заканчиваются другие идеи.даже возможно (без записи проверки в каждую из моих конечных точек какфа)?

1 Ответ

0 голосов
/ 28 сентября 2018

Извините за задержку;На этой неделе мы находимся в SpringOne Platform.

В настоящее время инфраструктура не передает Validator в преобразователь аргументов полезной нагрузки.Пожалуйста, откройте вопрос на GitHub .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...