说明

Hibernate Validator 是 Bean Validation 的参考实现。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。可查看hibernate-validator注解

集成

添加依赖

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.5.Final</version>
</dependency>

当然如果报异常,如下:

javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'.

你可能还需要添加

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
</dependency>

初始化

先看下使用

/**
 * save 与 update 的业务逻辑在实际应用中也应该放在 serivce 之中,
 * 并要对数据进正确性进行验证,在此仅为了偷懒
 */
public void save(@Valid BlogForm form) {
    // java bean转Model
    BeanUtils.copy(form, Blog.class).save();
    redirect("/blog");
}

public class BlogForm {
    private Integer id;
    @NotBlank(message = "请输入Blog标题!")
    private String title;
    @NotBlank(message = "请输入Blog内容!")
    private String content;
    // ..... 省略get、set
}

Controller(控制器)层获取模型Bean,使用@Valid注解标记完成校验。

在JFinal中使用Interceptor拦截器可以对控制器层轻松完成各种控制。

public class BeanValidator implements Interceptor {
    private final Validator validator;
    
    public BeanValidator() {
        // 初始化校验器
        this.validator = Validation.buildDefaultValidatorFactory().getValidator();
    }
    
    @Override
    public void intercept(Invocation inv) {
        // 获取方法参数数组
        Parameter[] params = inv.getMethod().getParameters();
        for (int i = 0; i < params.length; i++) {
            Parameter parameter = params[i];
            // 判断参数
            Valid valid = parameter.getAnnotation(Valid.class);
            if (valid == null) { continue; }
            Object object = inv.getArg(i);
            Set<ConstraintViolation<Object>> set = validator.validate(object);
            // 没有错误跳出
            if (set.isEmpty()) { continue; }
            // 校验错误信息返回
            ConstraintViolation<Object> v = set.stream().findFirst().get();
            Ret ret = Ret.fail("msg", v.getMessage());
            // 返回错误json
            inv.getController().renderJson(ret);
            return;
        }
        inv.invoke();
    }

}

当然上面你可以根据自己的业务定制。 BeanUtils可参考下面:https://gitee.com/dreamlu/Easy4JFinal/blob/master/easy-core/src/main/java/net/dreamlu/easy/commons/utils/BeanUtils.java