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());
}
}