Spring Boot自定义约束验证组件

时间:2018-12-13 14:28:16

标签: java spring javax.validation

配置类

@ComponentScan(basePackages = {"validator"})
class AppConfiguration { ... }

注释类

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueLoginValidator.class)
public @interface UniqueLogin {
    String message() default "{com.dolszewski.blog.UniqueLogin.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

验证器类

@Component
class UniqueLoginValidator implements ConstraintValidator<UniqueLogin, String> {

    private UserRepository userRepository;

    public UniqueLoginValidator(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void initialize(UniqueLogin constraint) {
    }

    public boolean isValid(String login, ConstraintValidatorContext context) {
        return login != null && !userRepository.findByLogin(login).isPresent();
    }

}

我有一个具有属性@UniqueLogin String login的类,我还使用了其他注释,例如@Size@Max,最后2种有效,但是我的自定义注释不起作用。

能否请您帮助理解为什么spring不调用自定义验证器?

1 个答案:

答案 0 :(得分:0)

我可以在#include <iostream> #include <unordered_map> #include <string> using namespace std; class Var { public: virtual void print() = 0; virtual Var *plus(int i) = 0; virtual Var *plus(float f) = 0; virtual Var *plus(Var *other) = 0; }; class IntVar: public Var { public: // constructors IntVar(); IntVar(int i); void print(); // operations Var *plus(int i); Var *plus(float f); Var *plus(Var *other); private: int val; }; class FloatVar: public Var { public: // constructors FloatVar(); FloatVar(float f); void print(); // operations Var *plus(int i); Var *plus(float f); Var *plus(Var *other); private: float val; }; // constructors IntVar::IntVar() { val = 0; } IntVar::IntVar(int i) { val = i; } void IntVar::print() { cout << "" << val << endl; } // operations Var *IntVar::plus(int i) { return new IntVar(i+val); } Var *IntVar::plus(float f) { return new FloatVar(f+val); } Var *IntVar::plus(Var *other) { return other->plus(val); } // constructors FloatVar::FloatVar() { val = 0; } FloatVar::FloatVar(float f) { val = f; } void FloatVar::print() { cout << "" << val << endl; } // operations Var *FloatVar::plus(int i) { return new FloatVar(i+val); } Var *FloatVar::plus(float f) { return new FloatVar(f+val); } Var *FloatVar::plus(Var *other) { return other->plus(val); } int main() { unordered_map<string, Var *> symbol_table; symbol_table["a"] = new IntVar(5); symbol_table["b"] = new FloatVar(2.3); symbol_table["c"] = symbol_table["a"]->plus(symbol_table["b"]); symbol_table["a"]->print(); symbol_table["b"]->print(); symbol_table["c"]->print(); return 0; } 内创建一个名为src/main/resources/META-INF/services的文件,并在其中列出新行,并用您创建的自定义约束验证器的所有合格名称分隔。

这样,Spring将自动注册自定义验证器。

将从Spring自动检查此文件并将其包含在内置工件中。

应用此解决方案后,请注意注释配置。您应使用javax.validation.ConstraintValidator进行注释,以防止双重验证程序初始化。