SpringBoot学习5.7-SpringMVC-参数验证-自定义参数验证器

目录

1.自定义参数验证器说明

2.定义pojo

3.自定义参数验证器

4.绑定自定义参数验证器

5.控制器方法

6.html/js

7.测试结果


1.自定义参数验证器说明

springmvc参数转换后获得一个JavaPojo,然后进入参数验证阶段。流程参考SpringBoot学习5.1-SpringMVC流程

springmvc支持自定义参数验证器及校验策略。

使用要点:

  • 通过实现Validator接口定义参数验证器,重写validate方法定义校验策略
  • 绑定自定义参数校验器(绑定时注意setValidator和addValidators的区别)
  • @Valid开启验证
  • Errors获取错误信息

2.定义pojo

pojo增加了JSR-303注解,这不是自定义参数验证器必需的,但是可以配合使用。

JSR-303注解验证的使用参考:SpringBoot学习5.6-SpringMVC-参数验证-JSR-303验证

/**用户,增加JSR-303验证*/
public class User {
	@NotNull(message = "不能为空")
	private String id;
 
	@Size(min = 3, max = 10, message = "长度必须在3到10")
	private String name;
 
	@Max(value = 3, message = "最大值为3")
	@Min(value = 1, message = "最小值为1")
	private int sex;
 
	@Size(min = 0, max = 100, message = "长度必须在0到100")
	private String note;
 
	@Past(message = "只能是过去的日期")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date birthday;
 
	@Future(message = "只能是将来的日期")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date fut;
 
	@DecimalMax(value = "1000.00", message = "不能大于1000.00")
	@DecimalMin(value = "0.01", message = "不能小于0.01")
	private BigDecimal yue;
 
	@Email(message = "必须符合邮箱地址格式")
	private String email;
 
	@Range(min = 1, max = 20, message = "范围必须是1到20")
	private Long rang;
 
	// setters and getters ......
}

3.自定义参数验证器

实现Validator接口,重写supports()和validate()方法。

supports()声明支持验证的pojo类型。

validate()定义校验逻辑。

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/** 自定义参数验证器 */
public class UserValidator implements Validator {
	
	/** 声明支持的校验类型为User */
	@Override
	public boolean supports(Class<?> clazz) {
		return clazz.equals(User.class);
	}

	/** 校验规则 */
	@Override
	public void validate(Object target, Errors errors) {
		if (null != target) {
			//supports()方法支持User,此处可以强转为User
			User user = (User) target;
			if (new BigDecimal("1000000").compareTo(user.getYue()) > 0) {
				errors.rejectValue("yue", "", "余额不足,请充值!");
			}
		}
	}
}

4.绑定自定义参数验证器

WebDataBinder不但可以绑定参数转换器,还可以绑定参数验证器.

注意到用addValidators()方法增加自定义参数验证器时,原来的JSR-303校验依旧有效,且自定义校验也有效(推荐)。

/**
 * 绑定自定义参数校验器
 * 	用setValidator()方法,原来的JSR-303则不做校验了
 * 	用addValidators()方法,原来的JSR-303校验依旧有效,且自定义校验也有效(推荐)
 */
@InitBinder
public void initBinder(WebDataBinder binder) {
	// binder.setValidator(new UserValidator());//设定参数校验器
	binder.addValidators(new UserValidator());// 增加参数校验器(可多个)
}

5.控制器方法

注解@Valid开启验证,Errors获取错误信息。

/**
 * 自定义参数校验
 * 	注解@Valid开启验证,否则JSR-303验证和UserValidator()都不生效
 */
@RequestMapping(value = "/mpv3")
@ResponseBody
private User mpv3(@Valid @RequestBody User user, Errors errors) {
	List<ObjectError> errList = errors.getAllErrors();
	for (ObjectError oError : errList) {
		// 如果是字段错误
		if (oError instanceof FieldError) {
			FieldError fe = (FieldError) oError;
			System.out.println(fe.getField() + "=" + fe.getRejectedValue() + ",消息=" + fe.getDefaultMessage());
		} else {
			System.out.println(oError.getObjectName() + ",消息=" + oError.getDefaultMessage());
		}
	}
	return user;
}

6.html/js

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MPV1</title>
<script src="https://code.jquery.com/jquery-3.2.0.js">
</script>
<script type="text/javascript">
	$(function() {
		var params = {
			id:null,
			name:'z',
			note:'数据验证',
			sex:4,
			birthday:'2020-01-01',
			fut:'2019-01-01',
			yue:2000,
			email:'qweertrty',
			rang:30
		};
		$("#button").click(function() {
			$.post({
				url : "/mvcparamvalidate/mpv3",
				// 此处需要告知传递参数类型为JSON,不能缺少
				contentType : "application/json",
				// 将JSON转化为字符串传递
				data : JSON.stringify(params),
				// 成功后的方法
				success : function(result) {}
			});
		});
	});
</script>
</head>
<body>
	<button id="button">按钮</button>
</body>
</html>

7.测试结果

访问http://localhost:8080/mvcparamvalidate/mpv1然后点击按钮。

rang=30,消息=范围必须是1到20
birthday=Wed Jan 01 08:00:00 CST 2020,消息=只能是过去的日期
sex=4,消息=最大值为3
id=null,消息=不能为空
name=z,消息=长度必须在3到10
email=qweertrty,消息=必须符合邮箱地址格式
yue=2000,消息=不能大于1000.00
fut=Tue Jan 01 08:00:00 CST 2019,消息=只能是将来的日期
yue=2000,消息=余额不足,请充值!

可以看到最后一条消息是自定义验证器的验证结果,且JSR-303注解验证依然生效。

 

github:https://github.com/zhangyangfei/SpringBootLearn.git中的springMVC工程。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值