工作中,想对一些参数进行非空默认值的操作。
@DefaultValueIfNull("1000")
这个就是,如果为null,那么就默认值填1000。
操作起来。
- @Component
- public class DefaultValueIfNullResolver implements HandlerMethodArgumentResolver {
-
- /**
- * 对参数进行默认操作,如果为空值,那么就需要进行特殊操作了
- **/
- private RequestParamMethodArgumentResolver requestParamResolver = new RequestParamMethodArgumentResolver(false);
-
- /**
- * 是否有这个注解
- * 如果参数上有 RequestParam 注解,就到不了这个方法
- * @see org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
- * 方法: getDefaultArgumentResolvers()
- * @see org.springframework.web.method.annotation.RequestParamMethodArgumentResolver
- * 方法:supportsParameter()
- * 在 getDefaultArgumentResolvers() 内,第一次就触发了 supportsParameter()。返回true,就走不到这里了
- *
- * @author
- * @date 2022-12-05 17:47
- **/
- @Override
- public boolean supportsParameter(MethodParameter parameter) {
- return parameter.hasParameterAnnotation(DefaultValueIfNull.class);
- }
-
- @Override
- public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
- // 1.首先用 requestParam来进行转换数据,大部分数据都可以完成
- Object value = requestParamResolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
- if( value != null && StringUtils.isNotBlank(value.toString()) ){
- return value;
- }
- // 到这里,说明 value 为null,或者为空字符串,那么根据 @DefaultValueIfNull 进行设置
- // 2.如果没有得到数据
- DefaultValueIfNull defaultValueIfNull = parameter.getParameterAnnotation(DefaultValueIfNull.class);
- // 此代码还未进行测试,需要进行类型转换,但这不是本文重点
- return defaultValueIfNull.value();
- }
- }
- @Configuration
- public class WebMvcConfig implements WebMvcConfigurer {
-
- @Autowired
- private DefaultValueIfNullResolver resolver;
-
- @Override
- public void addArgumentResolvers(List
resolvers) { - resolvers.add(resolver);
- }
- }
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
方法太长,截不完全,从这里可以看到,最后又添加了一个
RequestParamMethodArgumentResolver
第一个添加的是
useDefaultResolution = false;
第二添加的是true.
从方法名也可以看出来,这是前面第一个不是默认解决方法,后面是默认解决方法。
最后一个RequestParamMethodArgumentResolver 主要是检查参数类型是不是一些常见类型
经测试,第一个RequestParam会直接进行处理。不会进入到自定义解析器中。