0.pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Cairo-SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <!--设置程序执行的主类 -->
<mainClass>com.jz.WebsocketApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<finalName>annotation-demo</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
1.新建@MobileValidator类
package com.xdl.annotation.config;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Retention(RUNTIME)
@Target(FIELD)
/**
* @author liurui
* @date 2019年9月14日
*/
@Constraint(validatedBy= {MobileAnnotationValidator.class}) // @Constraint:用于校验属性值是否合法
public @interface MobileAnnotation {
boolean required() default true;
String message() default "手机号格式错误";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
2.新建实际校验的类MobileAnnotationValidator
package com.xdl.annotation.config;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.xdl.annotation.utils.tools.EasyStrUtil;
/**
* @author liurui
* @date 2019年9月14日
*/
public class MobileAnnotationValidator implements ConstraintValidator<MobileAnnotation, String>{
private boolean required = false;
private static final Pattern mobile_pattern = Pattern.compile("^1[3|4|5|7|8][0-9]\\d{8}$");
@Override
public void initialize(MobileAnnotation constraintAnnotation) {
this.required = constraintAnnotation.required();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(!required) { // 不是必填的
if(EasyStrUtil.isEmpty(value)) return true;
} // 必填
return mobile_pattern.matcher(value).matches();
}
}
3.新建springBoot启动类
package com.xdl;
import javax.validation.Valid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.xdl.annotation.domain.vo.User;
import com.xdl.annotation.utils.result.AllResult;
/**
* @author liurui
* @date 2019年9月14日
*/
@SpringBootApplication
@RestController
@RequestMapping("/param")
public class AnnotationApplication {
public static void main(String[] args) {
SpringApplication.run(AnnotationApplication.class, args);
}
@GetMapping("/validator")
public AllResult validator(@Valid User user) {
return AllResult.ok(user);
}
}
4.全局异常拦截器
因为在Controller中添加@Valid注解,如果方法Bean中的参数不符合要求,就不会进入方法体,直接抛出异常BindException,需要定义一个全局异常处理器,返回一个自定义的JSON结果,更加友好一些。
package com.xdl.annotation.config.exception;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.xdl.annotation.utils.result.AllResult;
/**
* @author liurui
* @date 2019年8月26日
*/
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value=Exception.class)
public AllResult exceptionHandler(HttpServletRequest request,Exception e){
e.printStackTrace();
if(e instanceof BindException) {
BindException ex = (BindException)e;
List<ObjectError> allErrors = ex.getAllErrors();
ObjectError error = allErrors.get(0);
String message = error.getDefaultMessage();
return AllResult.build(500,message);
}else {
return AllResult.build(500,e.getMessage());
}
}
}
5.启动测试
浏览器访问:localhost:8080/param/validator?mobile=3232
测试结果:
源码(如果过期直接留言,第一时间更新):
链接:https://pan.baidu.com/s/1tMm5geTRecVQl-mtDHTS_g
提取码:x979