有时候@Valid并没有触发验证,将BindingResult errors打印出来显示的是0 errors
这个时候需要检测下你是不是引用了注解@NotNull:不能为null,但可以为empty(""," "," ") …
当你接收到“”空字符串的情况下 会判定为empty ,并不是null 所以是不会触发的 也就是0 errors
当你需要判段为空的接收参数比较多的时候,这种注解的方式还是非常方便的
1.引入Vo
public class UserScheduleVo {
@NotBlank(message = "赛事不能为空")
private String matchEventName; // 赛事名称
@NotBlank(message = "发枪时间不能为空")
@Pattern(regexp = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", message = "发枪格式错误")
private String gunTime; // 发枪时间
@NotNull(message = "国家ID不能为空")
@Min(value = 0,message = "国家ID数据格式错误")
private int dicCountryId; // 国家ID
@NotBlank(message = "国家名称不能为空")
private String countryName; // 国家名称
@NotNull(message = "省份ID不能为空")
@Min(value = 0,message = "省份ID数据格式错误")
private int dicProvinceId; // 省份ID
@NotBlank(message = "省份名称不能为空")
private String provinceName; // 省份名称
@NotNull(message = "城市ID不能为空")
@Min(value = 0,message = "城市ID数据格式错误")
private int dicCityId; // 城市ID
@NotBlank(message = "城市名称不能为空")
private String cityName; // 城市名称
}
- 编写 Controller这里需要注意的问题:@Valid和@RequestBody是有位置关系的,必须@Valid在前面。BindingResult bindingResult作为参数传递进来,然后通过validate校验参数,并设置统一的返回结果。
@Controller
@RequestMapping("testController/*")
public class TestController {
@RequestMapping(value = "tstex", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ApiOperation(value = "测试异常方法", notes = "测试异常方法")
public @ResponseBody String tstex(@Valid @RequestBody UserScheduleVo userScheduleVo ,
BindingResult bindingResult) {
//每次只能返回其中的第一个错误
//如果都要返回 需要下方的3遍历进行拼接返回,或者map集合返回
if (results.hasErrors()){
return R(1001,results.getFieldError().getDefaultMessage());
}
return R();
}
3.遍历所有错误的信息
//有错误信息,就遍历出所有的错误信心,放在map中
if (result.hasErrors()) {
Map err = new HashMap();
List list = result.getFieldErrors();
FieldError error = null;
for (int i = 0; i < list.size(); i++) {
error = list.get(i);
err.put(error.getField(), error.getDefaultMessage());
}
//仍在request中,jsp页面可以直接获取。
request.setAttribute("errfields", err);
}
4.注解文档说明
限制注解 说明 限制类型 样例
@Null 限制只能为null 全部 @Null(message="")
@NotNull 限制必须不为null 全部 @NotNull(message="")
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字 int @Max(value=100,message="")
@Min(value) 限制必须为一个不小于指定值的数字 int @Min(value=100,message="")
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式 String
@Pattern(regexp="",message="")
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) String
@NotEmpty(message = "")
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 String
@NotBlank(message = "")
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 String