|
80 | 80 | }
|
81 | 81 | }
|
82 | 82 | (使用实体对象传参的方式参数校验需要在相应的参数前加上@Valid注解)
|
83 |
| -5.自定义校验规则: |
| 83 | +5.分组校验: |
| 84 | + [1]创建分组接口: |
| 85 | + public interface AddGroup {} |
| 86 | + public interface UpdateGroup {} |
| 87 | + [2]给需要校验的实体类属性添加校验注解: |
| 88 | + public class Student { |
| 89 | + @Min(value = 1, groups = {AddGroup.class}) |
| 90 | + private int studentNo; |
| 91 | + @NotBlank(message = "姓名不能为空", groups = {AddGroup.class, UpdateGroup.class}) |
| 92 | + private String name; |
| 93 | + @Min(value = 1,groups = {AddGroup.class, UpdateGroup.class}) |
| 94 | + private int age; |
| 95 | + @Pattern(regexp = "^[0|1]$",message = "性别只能是1:男 0:女", |
| 96 | + groups = {AddGroup.class,UpdateGroup.class}) |
| 97 | + private String gender; |
| 98 | + public Student() {} |
| 99 | + // get,set略 |
| 100 | + } |
| 101 | + [3]使用@Validated修饰参数为包含校验属性对象: |
| 102 | + @Controller |
| 103 | + public class TestGroupController { |
| 104 | + // 注: 参数BindingResult对象打开,则需要在方法中处理校验异常,关闭则可交由统一异常处理方法处理 |
| 105 | + @GetMapping("test3") |
| 106 | + @ResponseBody |
| 107 | + public String test3(@Validated(AddGroup.class) Student student, |
| 108 | + BindingResult result) { |
| 109 | + if(result.hasErrors()){ |
| 110 | + StringBuilder stringBuilder = new StringBuilder(); |
| 111 | + // 获取校验的错误结果 |
| 112 | + result.getFieldErrors().forEach(item->{ |
| 113 | + // 获取错误的属性的名字 |
| 114 | + String field = item.getField(); |
| 115 | + // 获取到错误提示 |
| 116 | + String message = item.getDefaultMessage(); |
| 117 | + stringBuilder.append(field).append("-").append(message).append(", "); |
| 118 | + }); |
| 119 | + return "提交的数据不合法: "+ stringBuilder.toString(); |
| 120 | + } |
| 121 | + return "success"; |
| 122 | + } |
| 123 | + } |
| 124 | + 注: |
| 125 | + 使用分组校验后,未添加分组的属性不会进行校验; |
| 126 | + BindingResult对象一旦在方法参数中使用,校验异常时会自动将异常捕捉封装进该对象,不会向外抛出; |
| 127 | + [4]测试: http://localhost:8080/test3?studentNo=1&name=柯南&age=8&gender=1 |
| 128 | +6.自定义校验规则: |
84 | 129 | [1]自定义校验注解的基本格式:
|
85 | 130 | @Target({ElementType.FIELD, ElementType.METHOD})
|
86 | 131 | @Retention(RetentionPolicy.RUNTIME)
|
|
112 | 157 | @Controller
|
113 | 158 | @Validated
|
114 | 159 | public class TestCustomController {
|
115 |
| - @GetMapping("test3") |
| 160 | + @GetMapping("test4") |
116 | 161 | @ResponseBody
|
117 |
| - public String test3(@MyConstraint(message = "{illegal}") String name){ |
| 162 | + public String test4(@MyConstraint(message = "{illegal}") String name){ |
118 | 163 | return "success";
|
119 | 164 | }
|
120 | 165 | }
|
|
139 | 184 | @ResponseStatus(HttpStatus.BAD_REQUEST)
|
140 | 185 | public String handleBindException(BindException e){
|
141 | 186 | // 这里异常处理仅仅是简单地将校验异常的实体类及其属性和异常信息拼接后返回
|
142 |
| - StringBuilder message = new StringBuilder(); |
143 |
| - FieldError fieldError = e.getFieldError(); |
144 |
| - message.append("Object:") |
145 |
| - .append(e.getObjectName()) |
146 |
| - .append(" Field:") |
147 |
| - .append(fieldError.getField()) |
148 |
| - .append(" Message:") |
149 |
| - .append(fieldError.getDefaultMessage()); |
150 |
| - return message.toString(); |
| 187 | + StringBuilder stringBuilder = new StringBuilder(); |
| 188 | + e.getFieldErrors().forEach(item ->{ |
| 189 | + // 获取错误的属性的名字 |
| 190 | + String field = item.getField(); |
| 191 | + // 获取到错误提示 |
| 192 | + String message = item.getDefaultMessage(); |
| 193 | + stringBuilder.append(field).append("-").append(message).append(", "); |
| 194 | + }); |
| 195 | + return stringBuilder.toString(); |
151 | 196 | }
|
152 | 197 | }
|
153 | 198 | ```
|
0 commit comments