1、springboot 接入
第一步 引入xml
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>validated-springboot-starter</artifactId>
<version>2.0.1</version>
</dependency>
第二步 使用@Validated开启接口参数验证
@Controller
public class EmailController {
@RequestMapping("/emailCheck")
@ResponseBody
@Validated //注意此处
public String demo(@Email(msg="邮箱格式不正确,请重新填写") String email){
return email;
}
@RequestMapping("/emailCheck2")
@ResponseBody
@Validated //注意此处
public String demo(EmailMode emailMode){
return emailMode.toString();
}
@Data
@ToString
class EmailMode{
@Email(msg="邮箱格式不正确,请重新填写")
private String email;
}
}
验证结果
2、springmvc 接入
第一步引入xml
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>mars-validated</artifactId>
<version>2.0.1</version>
</dependency>
第二步引入spring容器
@Component
@Configuration
//使用 @EnableValidatedConfig 开启注入
@EnableValidatedConfig(fileName = "valid",language="zh_CN",localeParamName="lang")
public class ValidConfig {
//fileName 代表配置文件名 !!!不使用可以不配置
//language 代表语言 !!!不使用可以不配置
//localeParamName 代表接受参数名(为支持错误提示内容国际化实现) !!!不使用可以不配置
}
第三步 使用验证
@Controller
public class EmailController {
@RequestMapping("/emailCheck")
@ResponseBody
@Validated //注意此处
public String demo(@Email(msg="邮箱格式不正确,请重新填写") String email){
return email;
}
@RequestMapping("/emailCheck2")
@ResponseBody
@Validated //注意此处
public String demo(EmailMode emailMode){
return emailMode.toString();
}
@Data
@ToString
class EmailMode{
@Email(msg="邮箱格式不正确,请重新填写")
private String email;
}
}
验证结果
@Validated 注解支持功能
| 方法 | 作用 |
|---|---|
| Class<?>[] validClass() default {} | 需要校验的 class |
| Class<?>[] groups() default { } | 校验组 |
| boolean failFast() default true | true 快速失败 |
| boolean validReturnValue() default false | 验证返回值 默认false |
已知注解
| Annotation | Supported data types | 作用 |
|---|---|---|
| NotBlank | String | 验证String 字符串是否为空 |
| NotNull | String,Object,Integer,Long,Double,Short,Float,BigDecimal, BigInteger | 验证对象是否为空 |
| NotEmpty | String | 验证字符串不能为空 |
| AssertFalse | Boolean,boolean,String | 只能为false |
| AssertTrue | Boolean,boolean,String | 只能为true |
| BankCard | String | 验证银行卡 |
| CreditCard | String | 验证信用卡 |
| Default | Integer,Double,Long,Short,Float,BigDecimal,String | 设置默认值 |
| Digits | String | 验证是否是数字 |
| String | 验证是否是邮箱 | |
| IdCard | String | 验证是否是身份证,验证18岁 |
| Length | int,long,short,double,Integer,Long,Float,Double,Short,String | 验证长度 |
| Pattern | String | 正则表达式验证 |
| Phone | String | 验证手机号是否正确 |
| Size | object[],boolean[],byte[],char[],double[],float[],int[],long[],short[],String length,Collection,Map | 验证大小值 |
| NotEqualLength | String | 验证长度 |
支持自定义注解
//第一步添加一个自定义注解
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CustomBeanConstraintValidatorBean.class})
public @interface CustomBean {
//没有任何参数
}
//第二步 实现自定义注解接口 ConstraintValidator
public class CustomBeanConstraintValidatorBean implements ConstraintValidator<CustomBean, Object> {
//验证单个属性逻辑
@Override
public boolean isValid(CustomBean annotation, Object value, Class<?> valueType) {
return true;
}
//验证 Class 类逻辑
@Override
public String validObject(CustomBean custom, Object var,Class<?> valueType) {
if (var instanceof ValidBeanModel){
ValidBeanModel beanModel= (ValidBeanModel) var;
if (beanModel!=null && (beanModel.getA1()==null || beanModel.getA2()==null)){
return "a1 或者 a2 为空";
}
}
/**
* return null 则验证成功 其他验证失败
*/
return null;
}
//验证过程中,修改 class 属性值逻辑
@Override
public Object modify(CustomBean annotation, Object var,Class<?> valueType) {
System.out.println("CustomConstraintValidator:"+var);
if (var instanceof ValidBeanModel){
ValidBeanModel beanModel= (ValidBeanModel) var;
beanModel.setA1("1");
beanModel.setA2("2");
return beanModel;
}
return var;
}
}
//第三步使用
@Controller
@RequestMapping("custom")
public class CustomController {
@RequestMapping("demo1")
@ResponseBody
@Validated(failFast = false)
public String demo1(@Custom(min=1)String abc){
return abc;
}
@RequestMapping("demo2")
@ResponseBody
@Validated
public String demo2(@Custom(min=1) DefaultModel defaultModel){
return JSON.toJSONString(defaultModel);
}
@RequestMapping("demo3")
@ResponseBody
@Validated
public String demo3(@Custom(min=1) CustomModel customModel){
return customModel.getAbc();
}
}
支持 自定义aop 实现验证
@Component
@Aspect
public class ValidAspect {
@Pointcut("execution(* com.github.fashion.test.service.*.*(..))")
private void pointcut() {}
@Autowired
private MarsValidator marsValidator;
@Around(value = "pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//打印方法的信息
Object[] args = joinPoint.getArgs();
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
//自定义参数验证
marsValidator.parameterAnnotationValid(methodSignature.getMethod(),args);
return joinPoint.proceed();
}
}
使用全局异常拦截器
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ValidatedException.class)
@ResponseStatus(HttpStatus.OK)
public Object ValidatedException(ValidatedException e) {
List<MarsViolation> violations = e.getViolations();
return String.join(",",violations.stream().map(m-> m.getMsg()).collect(Collectors.toList()));
}
}
支持 国际化消息提示(现支持中英文两种)
请求:http://localhost:8080/l18n/test?lang=en_us
提示:must not be empty
请求:http://localhost:8080/l18n/test?lang=zh_CN
提示:不能为空
其他语言需要自行添加到项目 resources 下 properties文件
@RequestMapping("/l18n")
@Controller
public class I18nController {
@RequestMapping("/test")
@ResponseBody
@Validated
public String test(@NotEmpty() String abc){
return abc;
}
}
如果有问题可参考demo
github.com/fashionbrot…
如果有bug可通过已下反馈
github.com/fashionbrot…
如果您觉得工具不错,还请你帮忙点个 Star github地址:github.com/fashionbrot…