HandlerMethodArgumentResolver
接口是 Spring MVC 中的一个接口,用于解析控制器方法的参数。
下面演示如何自定义一个@NotBlank
注解,并实现相应的HandlerMethodArgumentResolver
,来校验前端传递的参数是否为空。
1. 创建自定义注解@NotBlank
首先,定义一个自定义注解@NotBlank
,用于标记需要验证的方法参数。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotBlank {String message() default "不能为空!";
}
2. 创建HandlerMethodArgumentResolver
然后创建一个实现HandlerMethodArgumentResolver
的类,该类将进行参数验证。
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;public class NotBlankArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(NotBlank.class);}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {String value = webRequest.getParameter(parameter.getParameterName());// 参数验证if (value == null || value.trim().isEmpty()) {String message = parameter.getParameterAnnotation(NotBlank.class).message();throw new IllegalArgumentException(message);}return value; // 返回原始值,或根据需要转换}
}
3. 注册解析器
在 Spring 配置中注册自定义的HandlerMethodArgumentResolver
:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new NotBlankArgumentResolver());}
}
4. 使用自定义参数解析器的控制器
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestParam;@RestController
public class ExampleController {@GetMapping("/example")public String example(@RequestParam(value = "input", required = false) @NotBlank String input) {return "已校验数据:" + input;}
}