实战问题之-找出新办法优于@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());  
    }  
}
相关推荐
熊猫钓鱼>_>2 小时前
Java面向对象核心面试技术考点深度解析
java·开发语言·面试·面向对象··class·oop
知其然亦知其所以然2 小时前
这波AI太原生了!SpringAI让PostgreSQL秒变智能数据库!
后端·spring·postgresql
进击的野人4 小时前
CSS选择器与层叠机制
css·面试
zhaomx19895 小时前
Spring 事务管理 Transaction rolled back because it has been marked as rollback-only
数据库·spring
曹朋羽5 小时前
Spring EL 表达式
java·spring·el表达式
T___T6 小时前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人6 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
勤劳打代码7 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
亚林瓜子7 小时前
Spring中的异步任务(CompletableFuture版)
java·spring boot·spring·async·future·异步
努力学算法的蒟蒻7 小时前
day10(11.7)——leetcode面试经典150
面试