参考资料
JSR303、349 -Bean Validation 数据校验规范使用说明和验证流程源码分析
Spring 全局异常处理
注意事项
- 使用Java JSR303、349 Bean Validation 数据校验规范来做数据校验 参考资料:JSR303、349 -Bean Validation 数据校验规范使用说明和验证流程源码分析
- 利用好分组 减少校验的逻辑代码
- 分组的class 需要的是接口,我们可以专门定义一个包来存放
- 配置全局异常统一处理 ,这样可以对业务异常,以及校验异常等进行统一的处理,解放代码逻辑
带分组的Demo
MobileValidator 校验类如下:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MobileValidator implements ConstraintValidator<Mobile, String> {
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
System.out.println("Mobile 手机号为:" + s);
return true;
}
}
注解如下:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MobileValidator.class)
public @interface Mobile {
String message() default "手机号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Controller
@Slf4j
@RestController
public class MainController {
@RequestMapping("/login")
public String login(@Validated(value = LoginGroup.class) UserAO userAO) {
log.info("userAO:" + JSON.toJSONString(userAO));
return JSON.toJSONString(userAO);
}
@RequestMapping("/forget")
public String forget(@Validated(value = ForgetPasswordGroup.class) UserAO userAO) {
log.info("userAO:" + JSON.toJSONString(userAO));
return JSON.toJSONString(userAO);
}
被校验的实体类UserAO
@Data
public class UserAO {
@NotBlank(message = "用户名不能为空", groups = LoginGroup.class)
private String username;
@NotBlank(message = "登录时密码不能为空", groups = LoginGroup.class)
@NotBlank(message = "忘记密码时旧密码不能为空", groups = ForgetPasswordGroup.class)
private String password;
@NotBlank(message = "忘记密码时新密码不能为空", groups = ForgetPasswordGroup.class)
private String newPassword;
}
如果部分属性是通用的校验可以通过继承接口的方式来实现
接口
public interface MobileBaseGroup {
}
public interface LoginGroup extends MobileBaseGroup{
}
public interface ForgetPasswordGroup extends MobileBaseGroup{
}
校验实体
@Data
public class UserAO {
//配置通用注解 因为LoginGroup 和 ForgetPasswordGroup 都继承了MobileBaseGroup 所有都会对该字段进行校验
@NotBlank(message = "用户名不能为空", groups = MobileBaseGroup.class)
private String username;
@NotBlank(message = "登录时密码不能为空", groups = LoginGroup.class)
@NotBlank(message = "忘记密码时旧密码不能为空", groups = ForgetPasswordGroup.class)
private String password;
@NotBlank(message = "忘记密码时新密码不能为空", groups = ForgetPasswordGroup.class)
private String newPassword;
}
总结
Spring中实现了对javax 校验框架的支持,我们利用javax 校验框架来实现,参数校验可以减少很多 if类型的校验代码,让开发尽量关注业务逻辑,使得代码逻辑更清晰。
总的来说就是, 开发效率提高,代码简化,方便阅读。
不足之处:
一. 对JSR 没有任何的了解?,需要阅读相关JSE, J2EE 的 JSR 规定,阅读地址
- JAVA EE https://www.jcp.org/en/jsr/platform?listBy=3&listByType=platform
- JAVA SE https://www.jcp.org/en/jsr/platform?listBy=2&listByType=platform
- JAVA ME https://www.jcp.org/en/jsr/platform?listBy=1&listByType=platform
二. 对Spring如何实现该校验框架,是否有其他的扩展和支持?,一无所知
要求:了解校验框架的实现原理
三. Spring校验校验的自定义 校验如何实现?