实战问题之-找出新办法优于@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());  
    }  
}
相关推荐
云烟成雨TD8 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Java成神之路-9 小时前
SpringMVC 响应实战指南:页面、文本、JSON 返回全流程(Spring系列13)
java·spring·json
风止何安啊9 小时前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
砍材农夫9 小时前
spring-ai 第六模型介绍-聊天模型
java·人工智能·spring
云烟成雨TD10 小时前
Spring AI Alibaba 1.x 系列【5】ReactAgent 构建器深度源码解析
java·人工智能·spring
Flittly11 小时前
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
java·笔记·spring·ai·springboot
Flittly11 小时前
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
java·spring boot·笔记·spring·ai
mfxcyh12 小时前
基于xml、注解、JavaConfig实现spring的ioc
xml·java·spring
Flittly12 小时前
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
java·spring boot·spring·ai