What is `addArgumentResolvers` does in `WebMvcConfigurer` ?

addArgumentResolversSpringMVC框架中,主要用于向Spring容器注册自定义的参数解析器。在处理HTTP请求时,SpringMVC会使用这些参数解析器将请求中的数据(如查询参数、路径变量、表单数据等)转换并注入到控制器方法的参数中。

使用样例

第1步:自定义的Date参数解析器

java 复制代码
public class CustomDateArgumentResolver implements HandlerMethodArgumentResolver {
    private static final String[] format = {"yyyy-MM-dd"};
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 获取传入参数的类型
        Class<?> type = parameter.getParameterType();
        // 如果参数类型有为Student类的则符合,进入resolveArgument方法
        return Date.class == type;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 从请求中获取日期字符串,并转换为Date对象
        return DateUtils.parseDate(webRequest.getParameter("date"), format);
    }
}

第2步:向Spring容器注册自定义的参数解析器

java 复制代码
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 向SpringMVC框架中添加自定义参数解析器
     *
     * @param argumentResolvers SpringMVC已有的参数解析器列表,用于处理控制器方法的参数解析工作
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        // 添加一个自定义解析器,它能将请求中的字符串参数转换为Date类型,
        // 例如:假设前端传递的是"2022-12-31"这样的日期字符串,通过此解析器可直接注入到控制器方法的Date类型参数中。
        argumentResolvers.add(new CustomDateArgumentResolver());
    }
}

第3步:使用

java 复制代码
@Controller
public class CustomArgumentResolverController {

    @GetMapping("/customDateArgumentResolver")
    public String handleDate(Date date,Date date3) {
        // 此处的date参数会由CustomDateArgumentResolver解析注入
        System.out.println(date);
        return "success";
    }
}

遗留问题

http://localhost:8080/customDateArgumentResolver?date=2024-01-14&date2=2024-01-13 这种多参数解析没玩明白

参考

WebMvcConfigurer中addArgumentResolvers方法的使用

相关推荐
计算机小白一个23 分钟前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
菠菠萝宝37 分钟前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
不会Hello World的小苗44 分钟前
Java——链表(LinkedList)
java·开发语言·链表
Allen Bright1 小时前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌1 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌1 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
是姜姜啊!2 小时前
redis的应用,缓存,分布式锁
java·redis·spring
梨落秋溪、2 小时前
输入框元素覆盖冲突
java·服务器·前端
hrrrrb2 小时前
【Java】Java 常用核心类篇 —— 时间-日期API(上)
java·开发语言
小突突突2 小时前
模拟实现Java中的计时器
java·开发语言·后端·java-ee