自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?

工作中,想对一些参数进行非空默认值的操作。

自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?_第1张图片

 

@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 
* 方法: 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 resolvers) {
        resolvers.add(resolver);
    }
}

3.Spring具体添加代码

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

 

自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?_第2张图片

自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?_第3张图片

方法太长,截不完全,从这里可以看到,最后又添加了一个 

RequestParamMethodArgumentResolver

第一个添加的是 

useDefaultResolution = false;

第二添加的是true.

从方法名也可以看出来,这是前面第一个不是默认解决方法,后面是默认解决方法。

4.RequestParamMethodArgumentResolver

 自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?_第4张图片

 最后一个RequestParamMethodArgumentResolver 主要是检查参数类型是不是一些常见类型

 

5.又有 @RequestParam 又有自定义 HandlerMethodArgumentResolver

自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?_第5张图片

 经测试,第一个RequestParam会直接进行处理。不会进入到自定义解析器中。

你可能感兴趣的:(Springboot,java,java,mvc,spring)