实战问题之-找出新办法优于@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());  
    }  
}
相关推荐
无情白8 小时前
k8s运维面试总结(持续更新)
运维·面试·kubernetes
VX_CXsjNo18 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
ylfhpy8 小时前
Java面试黄金宝典33
java·开发语言·数据结构·面试·职场和发展·排序算法
小小鸭程序员9 小时前
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
java·vue.js·spring·ui·elementui
拉不动的猪9 小时前
uniapp与React Native/vue 的简单对比
前端·vue.js·面试
Zevalin爱灰灰11 小时前
面试可能会遇到的问题&回答(嵌入式软件开发部分)
stm32·单片机·面试·操作系统·嵌入式·ucos
hycccccch12 小时前
Springcache+xxljob实现定时刷新缓存
java·后端·spring·缓存
鸭梨大大大12 小时前
Spring Web MVC入门
前端·spring·mvc
蛇皮划水怪12 小时前
代码随想录-图论-图经典算法
面试
uhakadotcom13 小时前
阿里云Tea OpenAPI:简化Java与阿里云服务交互
后端·面试·github