自定义参数解析器

92 阅读1分钟

方法一:使用HandlerInterceptor

  1. 定义Interceptor: 实现HandlerInterceptor接口,然后在preHandle方法中检查请求对象是否实现了Validatable接口,如果实现了就调用validParam方法。

    java复制
    public class ValidationInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (handler instanceof HandlerMethod) {
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Object bean = handlerMethod.getBean();
    
                if (bean instanceof Validatable) {
                    ((Validatable) bean).validParam();
                }
            }
            return true;
        }
    }
    
  2. 注册Interceptor: 在Spring配置中注册上面的Interceptor。

    java复制
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new ValidationInterceptor());
        }
    }
    

方法二:使用@ControllerAdvice@InitBinder

  1. 定义全局的@ControllerAdvice 利用@InitBinder钩子,在请求绑定到方法参数之后进行验证。

    java复制
    @ControllerAdvice
    public class GlobalBindingInitializer {
        
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            Object target = binder.getTarget();
            if (target instanceof Validatable) {
                ((Validatable) target).validParam();
            }
        }
    }
    

这个方法的优点是无需在每个控制器方法中显式调用验证逻辑,可以在请求处理流程的早期统一处理验证。