代码中经常会对请求参数是否为空,是否为手机号码,是否为邮件格式,是否为数字等类型判断,对这类处理可以写一个自定义参数验证类即可。
第一步:加入依赖包
<!--validation校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
第二步:定义一个注解
/**
* 非空验证
*
* @author wumq
*
*/
@Constraint(validatedBy = RequireAnnoValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface RequireAnno {
/**
* 错误信息
*
* @return
*/
String message() default "请求参数不能为空";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
其中@Constraint(validatedBy = RequireAnnoValidator.class),指定注解解析类。
这里有个注意点,注解类中必须包含下面几行代码:
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
如果不加上,会报下面错误信息:
javax.validation.ConstraintDefinitionException: HV000074: com.××××××.validate.annotation.RequireAnno contains Constraint annotation, but does not contain a groups parameter.
第三步:定义注解解析验证类
public class RequireAnnoValidator implements ConstraintValidator<RequireAnno, Object> {
@Override
public void initialize(RequireAnno constraintAnnotation) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
if (value instanceof String && StringUtils.isBlank(value.toString())) {
return false;
}
return true;
}
}
第四步:如何使用
@Validated
@Controller
@RequestMapping("/moduledemo/monitor")
public class MonitorController extends BaseController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public MonitorModel test(@RequestBody @Valid MonitorPo po) throws Exception {
MonitorModel model = new MonitorModel();
// throw new NullPointerException("test");
return model;
}
}
在Controller类上加上@Validated注解,同时在请求参数前面加上@Valid注解。否则就会出现注解无效。
百度上很多例子,都只是在参数前加上@Valid注解,但在Controller类上没加@Validated注解,实测注解无效,这个大家务必注意一下。
实际使用中还存在另外一个问题,如果参数对象中嵌套对象,这个对象中也要参数验证的话,那么就要在这个类的属性上,也要加@Valid注解,这点用起来不是很爽。当然也可以完全抛弃框架自带的验证器,完全自定义一个,然后自己做一个AOP切面拦截,去拦截@RequestBody注解的参数即可,包含嵌套参数都可以实现,这样就无需到处加@Validated和@Valid注解了。
|