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
本文仅仅抛砖,你可以制定规则将其封装得更加通用。