@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 问题,这样我们就不会忘记需要以某种方式解决这个问题。
我们使用 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 问题,这样我们就不会忘记需要以某种方式解决这个问题。