1.通过ConstraintValidator验证
pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
创建注解类,验证邮箱.
其中:
- @Target指明这个注解要作用在什么地方,可以是对象、域、构造器等,因为要作用在age域上,因此这里选择FIELD
- @Retention指明了注解的生命周期,可以有SOURCE(仅保存在源码中,会被编译器丢弃),CLASS(在class文件中可用,会被VM丢弃)以及RUNTIME(在运行期也被保留),这里选择了生命周期最长的RUNTIME
- @Constraint是最关键的,它表示这个注解是一个验证注解,并且指定了一个实现验证逻辑的验证器
- message()指明了验证失败后返回的消息,此方法为@Constraint要求
- groups()和payload()也为@Constraint要求,可默认为空,详细用途可以查看@Constraint文档
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = EmailConstraintValidator.class)
public @interface EmailConstraint {
String message() default "email格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class EmailConstraintValidator implements ConstraintValidator<EmailConstraint,Object> {
/**
* email校验正则表达式
*/
public static final String EMAIL_VALIDATION_REGP="^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$";
@Override
public void initialize(EmailConstraint constraintAnnotation) {
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
if (!Pattern.matches(EMAIL_VALIDATION_REGP,o.toString())) {
return false;
}
return true;
}
}
创建验证对象
@Data
public class Event {
@NotNull(message = "id不能为空")
private Long id;
@IntegerEnum(values = {1, 2, 3}, message = "类型错误")
private Integer type;
@EmailConstraint(message = "邮箱格式错误")
private String email;
@DataConstraint(value = "yyyy-MM-dd HH:mm:ss")
private String createdAt;
}
开启注解验证
public enum ResultCode {
SUCCESS(true,200,"success","success"),
PARAMETER_ERROR(false,406,"参数异常",""),
SYSTEM_ERROR(false,500,"系统异常","");
boolean success;
int code;
String errName;
String errMsg;
ResultCode(boolean success, int code, String errName, String errMsg) {
this.success = success;
this.code = code;
this.errName = errName;
this.errMsg = errMsg;
}
}
@Data
public class Result {
//成功/失败
private boolean success;
//异常编码,正常默认为0
private Integer errCode;
//异常名称
private String errName;
//异常信息
private String errMsg;
//业务数据
private Object datas;
/**
* 用于增,删,改操作。
* @param code
*/
public Result(ResultCode code){
this.success = code.success;
this.errCode = code.code;
this.errName = code.errName;
this.errMsg = code.errMsg;
}
/**
* 效验入参
* @param code
* @param message
*/
public Result(ResultCode code,String message){
this.success = code.success;
this.errCode = code.code;
this.errName = code.errName;
this.errMsg = message;
}
public Result(ResultCode resCode,Object data) {
this.success = resCode.success;
this.errCode = resCode.code;
this.errName = resCode.errName;
this.errMsg = resCode.errMsg;
this.datas = data;
}
public static Result SUCCESS(){
return new Result(ResultCode.SUCCESS);
}
public static Result ERROR(){
return new Result(ResultCode.SYSTEM_ERROR);
}
}
@RestController
public class TestController {
@PostMapping("/test")
public Result test(@Valid @RequestBody Event event, BindingResult validateResult) {
if (validateResult.hasErrors()) {
return new Result(ResultCode.PARAMETER_ERROR,validateResult.getAllErrors().get(0).getDefaultMessage());
}
return Result.SUCCESS();
}
}
2.配置拦截器验证
配置要拦截的路径
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 可添加多个
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**");
}
}
public class ThemeChangeInterceptor implements HandlerInterceptor {
//在请求方法之前执行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler){
if(!(handler instanceof HandlerMethod)) return true;
HandlerMethod handlerMethod = (HandlerMethod)handler;
CustomizeComponent customizeComponent = handlerMethod.getMethod().getAnnotation(CustomizeComponent.class);
if(customizeComponent != null){
System.out.println("有数据");
return true;
}
return false;
}
//在请求方法之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//在DispatcherServlet处理后执行----清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}