数据验证框架 Apache BVal 再使用
Posted sp42a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据验证框架 Apache BVal 再使用相关的知识,希望对你有一定的参考价值。
关于 Apache BVal,我 N 久之前使用过,还写了甚至全网唯一的简中教程《数据验证框架 Apache BVal 简介》,我依然还是那个观点:
Apache BVal (源码)是实体数据验证 Java Bean Validation 的参考实现。Apache BVal 提供了 JSR 303 规范中所有内置 constraint 的实现,用于对 Bean 中的字段的值进行约束定义、描述和验证。若单单说 JSR 规范大渣可能还不清楚,但做过 POJO 的 Hibernate Validator 注解的朋友就知道是啥,——那为什么不使用主流的 Hibernate Validator 呢?因为这货净是个压缩包都已经 13mb 了(尽管可以有文档、源码其他在内),BVal 才只有 400 多 kb,而我只需要服务端验证而已,——天真的孩纸伤不起啊。俺的 ORM 也是 Mybatis 的,务求尽可能地轻量级。
用法
Maven 引用
添加以下两个 Maven 依赖:
<dependency>
<groupId>org.apache.bval</groupId>
<artifactId>bval-jsr</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2.0 要求 Java 8,Apache CommonUtils 不是强依赖了,同时 JSR 验证规范也升级到 2.x。
整合 Spring
Spring 里面注入 Provider。
/**
* 数据验证框架
*
* @return
*/
@Bean
LocalValidatorFactoryBean localValidatorFactoryBean()
LocalValidatorFactoryBean v = new LocalValidatorFactoryBean();
v.setProviderClass(ApacheValidationProvider.class);
return v;
调用校验
手动校验方法,先试试
@Autowired
LocalValidatorFactoryBean v;
public List<DataDict> getDataDict(Long parentId)
List<DataDict> list = DataDictDao.DataDictDAO.setWhereQuery("parentId", parentId).findList();
Validator validator = v.getValidator();
Set<ConstraintViolation<DataDict>> violations = validator.validate(list.get(0));
System.out.println(violations.size()); // 校验结果
System.out.println(list.get(0).getParentId());
if (CollectionUtils.isEmpty(list))
list = new ArrayList<>();
return list;
上述代码是对一个 Java Bean:DataDict 进行校验,Bean 的字段可配置如下的约束。
public class DataDict implements CommonEntity
/**
* 主键 id,自增
*/
private Long id;
/**
* 父 id
*/
@NotNull
private Long parentId;
/**
* 类型 id
*/
@NotNull
private Long type;
……
更多校验注解参见旧文。
Spring MVC 自动校验
很简单,添加注解 @Valid
和参数 BindingResult result
。
/**
* 新建
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public String create(@Valid T news, BindingResult result,Model model)
System.out.println("新建");
if (result.hasErrors())
LOGGER.info("create error!");
else
LOGGER.info("create ok!");
news.setService(getService());
try
getService().create(news);
model.addAttribute("newlyId", news.getId());
catch (ServiceException e)
model.addAttribute("errMsg", e.toString());
return "common/entity/json_cud";
一定要注意的是,控制器方法的参数顺序。Binding Result 必须在 Bean 后面。这是 Spring MVC 的约定。MVC 对控制器其他参数的顺序没什么规定,唯独这个 BindingResult 作了如此规定。目的是为了可以允许有多个 bean,于是也就有多个 BindingResult。
怎么处理错误就不详细说了,不同场景下要求不同。
高级用法
Apache BVal 的功能还远不止这些,可以参考老外的文章学习更多高级用法。
以上是关于数据验证框架 Apache BVal 再使用的主要内容,如果未能解决你的问题,请参考以下文章