实战问题之-找出新办法优于@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());  
    }  
}
相关推荐
老神在在0014 小时前
Spring Bean 的六种作用域详解
java·后端·spring
仙草不加料4 小时前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
落魄江湖行5 小时前
基础篇一 Java 有了 int 为什么还要 Integer?它们到底差在哪?
java·面试·八股文
Rick19936 小时前
Spring AI 如何进行权限控制
人工智能·python·spring
星辰_mya6 小时前
OSI 七层模型之“跨国诈骗集团”深度讲解
运维·服务器·后端·面试·架构师
木斯佳7 小时前
前端八股文面经大全:字节暑期前端一面(2026-04-21)·面经深度解析
前端·面试·校招·面经·实习
我叫黑大帅7 小时前
其实跨域问题是后端来解决的? CORS
后端·面试·go
掘金安东尼8 小时前
OpenMUSE 全面详解:非扩散Transformer文生图开源基座(对标GPT Image 2)
前端·javascript·面试
下次再写8 小时前
Java互联网大厂面试技术问答实战:涵盖Java SE、Spring Boot、微服务及多场景应用
java·数据库·缓存·面试·springboot·microservices·技术问答