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

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

 

@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会直接进行处理。不会进入到自定义解析器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值