实战问题之-找出新办法优于@Valid注解执行

2024年第一篇文章来源于刚刚收到一个大神问题,说在SpringMVC中,有没有办法在@Valid注解之前执行,因为想要在此之前改变某些参数,再做校验

在Spring框架中,@Valid注解通常与Spring MVC一起使用,用于在控制器层对传入的请求体(例如,表单数据或JSON对象)进行验证。这个注解是在方法参数上使用的,并且在方法执行之前,由Spring的DispatcherServlet调用相应的Validator来执行验证逻辑。如果你希望自定义的切面逻辑能够在@Valid注解的验证之前执行,你需要在Spring的请求处理流程中更早地介入。由于@Valid注解的验证是在控制器方法被调用之前进行的,所以你需要在请求到达控制器之前的某个点进行切入。

这通常可以通过以下几种方式实现:

1.自定义过滤器(Filter:

在Spring的过滤器链中添加一个自定义过滤器,并在过滤器中执行你的逻辑。过滤器会在请求到达控制器之前执行,因此可以确保在@Valid注解之前运行你的代码。

java 复制代码
@Component  
public class MyCustomFilter implements Filter {  
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
            throws IOException, ServletException {  
        // 在这里执行你的切面逻辑  
  
        // 继续过滤器链  
        chain.doFilter(request, response);  
    }  
}

2. 自定义拦截器(Interceptor):

在Spring MVC的拦截器链中添加一个自定义拦截器,并在preHandle方法中执行你的逻辑。拦截器的preHandle方法会在控制器方法执行之前调用,因此可以在@Valid之前执行。

typescript 复制代码
public class MyCustomInterceptor implements HandlerInterceptor {  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  
        // 在这里执行你的切面逻辑  
  
        // 返回true继续执行,返回false则中断执行  
        return true;  
    }  
}

然后,你需要将拦截器注册到Spring MVC的配置中:

typescript 复制代码
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(new MyCustomInterceptor());  
    }  
}

3. 自定义参数解析器(Argument Resolver):

如果你的切面逻辑与方法参数的处理相关,你可以创建一个自定义的参数解析器,它可以在@Valid注解的验证之前对参数进行处理。

java 复制代码
public class MyCustomArgumentResolver implements HandlerMethodArgumentResolver {  
    @Override  
    public boolean supportsParameter(MethodParameter parameter) {  
        // 返回true如果你想处理这个参数  
        return true;  
    }

  


    @Override  
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,  
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {  
        // 在这里执行你的切面逻辑  
  
        // 返回参数的值  
        return null;  
    }  
}

然后,你需要将解析器注册到Spring MVC的配置中:

typescript 复制代码
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
    @Override  
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {  
        resolvers.add(new MyCustomArgumentResolver());  
    }  
}
相关推荐
L.EscaRC16 分钟前
深入解析SpringBoot中的循环依赖机制与解决方案
java·spring boot·spring·循环依赖
b***676436 分钟前
【JavaEE】Spring Web MVC
前端·spring·java-ee
e***74957 小时前
Spring Security 官网文档学习
java·学习·spring
Hero | 柒9 小时前
JAVA反射机制
java·spring·反射
山河亦问安10 小时前
Spring原理编码学习
java·学习·spring
芒克芒克10 小时前
JavaWeb 文件上传全方案解析:从传统组件到现代框架实现
java·spring boot·spring·servlet·maven
程序猿小蒜12 小时前
基于Spring Boot的宠物领养系统的设计与实现
java·前端·spring boot·后端·spring·宠物
嘟嘟w13 小时前
Spring 核心注解深度分析
java·后端·spring
川Princess14 小时前
【面试经验】百度Agent架构研发工程师一面
面试·职场和发展·架构·agent
uhakadotcom15 小时前
Next.js 从入门到精通(1):项目架构与 App Router—— 文件系统路由与目录结构全解析
前端·面试·github