模拟用户注册进行参数校验
开发者不需要编写验证逻辑,直接通过注解的形式就可以给每一条数据添加验证规则,具体操作是直接在实体类的属性上添加对于的校验规则即可,使用起来更加方便。
标准注解如下所示
接下来通过用户注册的场景来学习使用 JSR-303 标准进行数据校验
(1)创建 User 实体类,并通过注解给每个属性添加校验规则:
@Data
public class User {
@NotEmpty(message = "用户名不能为空")
private String username;
@Size(min = 6,max = 20,message = "密码长度为6-12位")
private String password;
@Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "请输入正确的邮箱格式")
private String email;
@Pattern(regexp = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$",message="请输入正确的电话格式")
private String phone;
}
(2)创建控制器 UserController,在业务方法 register 使用 @Valid 来绑定校验对象,@BindingResult 来保存错误信息。
@RestController
public class UserController {
/**
* 用户注册
* @param user
* @param bindingResult
* @return
*/
@PostMapping("/register")
public Object register(@Valid User user, BindingResult bindingResult) {
Map<String, Object> resultMap = new HashMap<>();
if (bindingResult.hasFieldErrors()) {
resultMap.put("code","001");
bindingResult.getFieldError();
resultMap.put("msg",bindingResult.getFieldError().getDefaultMessage());
return resultMap;
}
resultMap.put("code","000");
resultMap.put("msg","成功");
return resultMap;
}
}
(3)使用Postman工具进行测试
如果JSR-303提供的注解满足不了我们的需求,我们就需要自定义注解了。假设我们现在需要自定义一个校验手机号码的注解。
(1)新建IsMobile注解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class })
public @interface IsMobile {
String message() default "手机号码格式错误";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
(2)新建IsMobileValidator类
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
private static final Pattern MOBILE_PATTERN = Pattern.compile("^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$");
@Override
public void initialize(IsMobile constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(StringUtils.isEmpty(value)) {
return false;
}
Matcher m = MOBILE_PATTERN.matcher(value);
return m.matches();
}
}
通过以上两个步骤就实现了一个自定义的校验注解,用法如下:
@IsMobile(message = "无效的手机号")
private String phone;
代码地址:https://github.com/923226145/SpringBoot-learning/tree/master/springboot-chapter5