自定一个基于注解的分组参数检查器
分组叫校验参数
实际开发过程中可能遇到这种情况,当你定义了一个实体类作为参数接受的实体,这个实体类在多个接口中被使用,但是每个接口需要对不同的参数做校验,如果使用spring提供的原生的 参数注解校验,会导致所有的接口的参数的校验使用的是同一种校验规则,和实际需求不同,基于实际开发中遇到的需求,本人写了一个基于注解的分组参数校验,拿出来分享。
实际代码
定义的注解,
一、这个注解是一个标志性的注解,该注解作用于方法上,标志该方法的需要开启参数的注解校验
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsNeedCheck {
}
二、这个注解是真正验证的注解
@Target({
ElementType.FIELD})
@Retention(RUNTIME)
public @interface PropertyCheck {
/**
* 验证的正则表达式
* @return
*/
String regexp();
/**
* 注解参数需要验证的方法列表
* @return
*/
String[] methodName() default {
""};
/**
* 错误的提示信息
* @return
*/
String message();
}
注解处理:这里使用的是拦截器进行的校验,需要使用的者自定义一个拦截器,抛出的异常是自己定义的异常,使用者可以根据自己的需要自定义异常返回
public class ValidateInterceptor extends HandlerInterceptorAdapter {
private Logger logger = LoggerFactory.getLogger(DispatcherInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpRequestWrapper wrapper = (HttpRequestWrapper) (request);
Map<String, Object> valueMap = wrapper.body2ParamMap(request);
/** 不是注解到方法上 ,直接执行**/
if (!(handler instanceof HandlerMethod)) return true;
/** 有该注解则表明该接口需要进行参数校验**/
Method method = ((HandlerMethod) handler).getMethod();
IsNeedCheck needCheck = method.getAnnotation(IsNeedCheck.class);
if(needCheck == null){
return true;}
logger.info(