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

mac2026-01-20  5

目录

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)