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


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

     

    @DefaultValueIfNull("1000")

    这个就是,如果为null,那么就默认值填1000。

    操作起来。

    1.自定义HandlerMethodArgumentResolver 

    1. @Component
    2. public class DefaultValueIfNullResolver implements HandlerMethodArgumentResolver {
    3. /**
    4. * 对参数进行默认操作,如果为空值,那么就需要进行特殊操作了
    5. **/
    6. private RequestParamMethodArgumentResolver requestParamResolver = new RequestParamMethodArgumentResolver(false);
    7. /**
    8. * 是否有这个注解
    9. * 如果参数上有 RequestParam 注解,就到不了这个方法
    10. * @see org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
    11. * 方法: getDefaultArgumentResolvers()
    12. * @see org.springframework.web.method.annotation.RequestParamMethodArgumentResolver
    13. * 方法:supportsParameter()
    14. * 在 getDefaultArgumentResolvers() 内,第一次就触发了 supportsParameter()。返回true,就走不到这里了
    15. *
    16. * @author
    17. * @date 2022-12-05 17:47
    18. **/
    19. @Override
    20. public boolean supportsParameter(MethodParameter parameter) {
    21. return parameter.hasParameterAnnotation(DefaultValueIfNull.class);
    22. }
    23. @Override
    24. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    25. // 1.首先用 requestParam来进行转换数据,大部分数据都可以完成
    26. Object value = requestParamResolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
    27. if( value != null && StringUtils.isNotBlank(value.toString()) ){
    28. return value;
    29. }
    30. // 到这里,说明 value 为null,或者为空字符串,那么根据 @DefaultValueIfNull 进行设置
    31. // 2.如果没有得到数据
    32. DefaultValueIfNull defaultValueIfNull = parameter.getParameterAnnotation(DefaultValueIfNull.class);
    33. // 此代码还未进行测试,需要进行类型转换,但这不是本文重点
    34. return defaultValueIfNull.value();
    35. }
    36. }

    2.将自定义HandlerMethodArgumentResolver 添加到MVC容器中

    1. @Configuration
    2. public class WebMvcConfig implements WebMvcConfigurer {
    3. @Autowired
    4. private DefaultValueIfNullResolver resolver;
    5. @Override
    6. public void addArgumentResolvers(List resolvers) {
    7. resolvers.add(resolver);
    8. }
    9. }

    3.Spring具体添加代码

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

     

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

    RequestParamMethodArgumentResolver

    第一个添加的是 

    useDefaultResolution = false;

    第二添加的是true.

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

    4.RequestParamMethodArgumentResolver

     

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

     

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

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

  • 相关阅读:
    算法错题簿(持续更新)
    上周热点回顾(11.28-12.4)
    vr航空博物馆综合展馆趣味VR科普体验
    基于JAVA的旅游管理系统 毕业设计源码26681
    为什么创建 Redis 集群时会自动错开主从节点?
    C 学生管理系统 显示链表信息、删除链表
    《树莓派项目实战》第八节 使用光敏电阻传感器检测环境中是否有光照
    家庭网络中的组网方式
    关于哈希游戏开发详细逻辑分析丨解析区块链哈希游戏DAPP系统开发的技术原理是怎样
    嵌入式系统开发笔记88:认识51微控制器系统架构
  • 原文地址:https://blog.csdn.net/liu538430/article/details/128205355