@KafkaHandler 上的@Valid @Payload – 错误或缺少功能?

@Valid @Payload on @KafkaHandler – bug or missing feature?

我们使用 Spring Kafka 和 Spring Boot(所有最新版本)。我们将 Kafka 消息的处理切换为 @KafkaHandler 注释方法,并期望 @Valid/@Validated@Payload 一起确保有效负载验证,但这并没有发生。此功能适用于 @KafkaListener,是否也适用于 @KafkaHandler

@KafkaListener(...)
@Component
public class NotificationListener {

    @KafkaHandler
    public void handleV1(@Payload @Valid NotificationV1 notification) {

谢谢。

之所以@KafkaListener配合@Valid注解是因为它就像一个restful控制器端点,是服务的入口。团队致力于在这些情况下添加对验证的支持,可以发现这种验证机制是added in 2018.

至于@KafkaHandler,我对spring-kafka不是很熟悉,但是如果validation就是不行,说明团队没有对这种情况加支持.我建议您使用 Spring Boot Method Validation Feature,它适用于所有 spring 托管 bean 和所有标准验证注释,例如 @Size。最后一件事,小心验证失败时抛出的异常。

Validator 在这种情况下不适用,因为我们只是没有为此目的达到 PayloadMethodArgumentResolver

多方法 @KafkaListener 的目标有效负载已解析 在我们调用该方法之前 因为我们肯定需要知道要调用哪个方法。这样的逻辑是在InvocableHandlerMethod.getMethodArgumentValues():

中完成的
        args[i] = findProvidedArgument(parameter, providedArgs);
        if (args[i] != null) {
            continue;
        }
        ...
        try {
            args[i] = this.resolvers.resolveArgument(parameter, message);
        }

Validator 功能在那些 resolvers 中完成。 findProvidedArgument() 为我们提供了执行前转换的有效载荷,这里我们只是不检查参数上的任何注释。

当我们选择了一个处理程序并在其调用之前,我们可能需要将验证逻辑轮询到 DelegatingInvocableHandler...

随时提出 GitHub 问题,这样我们就不会忘记需要以某种方式解决这个问题。