工作中,想对一些参数进行非空默认值的操作。
@DefaultValueIfNull("1000")
这个就是,如果为null,那么就默认值填1000。
操作起来。
1.自定义HandlerMethodArgumentResolver
@Component
public class DefaultValueIfNullResolver implements HandlerMethodArgumentResolver {
/**
* 对参数进行默认操作,如果为空值,那么就需要进行特殊操作了
**/
private RequestParamMethodArgumentResolver requestParamResolver = new RequestParamMethodArgumentResolver(false);
/**
* 是否有这个注解
* 如果参数上有 RequestParam 注解,就到不了这个方法
* @see org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter <br>
* 方法: 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();
}
}
2.将自定义HandlerMethodArgumentResolver 添加到MVC容器中
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private DefaultValueIfNullResolver resolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(resolver);
}
}
3.Spring具体添加代码
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
方法太长,截不完全,从这里可以看到,最后又添加了一个
RequestParamMethodArgumentResolver
第一个添加的是
useDefaultResolution = false;
第二添加的是true.
从方法名也可以看出来,这是前面第一个不是默认解决方法,后面是默认解决方法。
4.RequestParamMethodArgumentResolver
最后一个RequestParamMethodArgumentResolver 主要是检查参数类型是不是一些常见类型
5.又有 @RequestParam 又有自定义 HandlerMethodArgumentResolver
经测试,第一个RequestParam会直接进行处理。不会进入到自定义解析器中。