如何注册自定义Spring验证器并进行自动依赖注入?

ehxuflar  于 2023-06-04  发布在  Spring
关注(0)|答案(2)|浏览(185)

当使用ConstraintValidator s时,我们只需要定义class和constraint,Spring就能够检测验证器并自动示例化它们,在构造函数中注入我们要求的任何bean。
如何以相同的方式添加自定义Spring Validator s(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/Validator.html)?

enxuqcxy

enxuqcxy1#

例如,在控制器中,您需要创建一个具有RequestBody和@valid注解的API

public ResponseEntity<String> foo(@RequestBody @Valid Bar bar){
//do sth
}

然后创建一个类,实现Spring Validator提供的Validator接口。你必须实现2个方法-> support和validate,在support方法中你必须设置你需要验证的类:这意味着在运行你的API方法之前,spring会看到有效的annotation并检查他们的Validator接口的实现,如果support class和你的requestBody class是相同的,那么在自定义验证器中运行validate方法。支持方法示例:

@Override
    public boolean supports(Class<?> clazz) {
        return Bar.class.equals(clazz);
    }

在你的validate方法中,你有两个输入-> object和error。首先将你的对象转换为Bar对象,然后开始验证Bar类,如果有错误,使用error.reject并用消息填充错误对象。如果error!=null,那么spring将向客户端返回400(错误请求)和您的自定义消息。

mpgws1up

mpgws1up2#

您必须让控制器知道哪个验证器将验证您的请求。我使用以下代码来查找支持的验证器:

@ControllerAdvice
@AllArgsConstructor
public class ControllerAdvisor {

    private final List<Validator> validators;

    @InitBinder
    public void initBinder(@NonNull final WebDataBinder binder) {
        final Object request= binder.getTarget();
        if (request== null) {
            return;
        }
        this.validators.stream()
            .filter(validator -> validator.supports(request.getClass()))
            .forEach(binder::addValidators);
    }

}

请注意,您必须将这些验证器创建为bean。因此,您应该使用@Component注解这些验证器。希望这对你有帮助。

相关问题