数据验证框架 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 再使用的主要内容,如果未能解决你的问题,请参考以下文章

数据验证框架 Apache BVal 再使用

数据验证框架 Apache BVal 简介

Java bean validation 规范与参考实现

thinkphp 注册验证

08.19安全帮®每日资讯:Apache Shiro身份验证绕过漏洞安全风险通告;美国再拉黑38家华为子公司

在 django rest 框架中使用令牌身份验证返回更多信息