springMvc的类型转换器

学习参考 :

springMvc中 类型转换器分为内置类型转换器和自定义类型转换器

内置

概念

SpringMVC提供了内置类型转换器,把客户端提交的字符串类型的请求参数,转换成控制器方法参数需要的数据类型

应用

比如: 下面这段代码中, 控制器方法的形参age是Integer类型,而客户端传过来的参数形式是age="10" ,因为在http请求中,参数都是字符串类型,但是我们却可以在方法中正确获取到Integer类型的age参数值,就是因为spring内置了字符串转数字的类型转换器

kotlin 复制代码
@RequestMapping("/editor1")
public String editor1(String name, Integer age) {
    System.out.println("name = " + name);
    System.out.println("age = " + age);
    return "param1";
}

但是,SpringMVC并不是对于所有的类型,都提供了内置的类型转换器,他只是提供了常见类型的转换器 比如:8种基本类型,常见的集合类型等,所以在某些场景下,我们需要自定义类型转换器

类型转换器的原理

Converter<S, T> 接口提供了 方法 public T convert(String source)

从此可以看出,S 代表接收到的客户端参数,也就是字符串 ,T是控制器方法形参,也就是我们想要的参数类型

比如内置类型转换器 实现age的转换

scala 复制代码
private static final class StringToNumber<T extends Number> implements Converter<String, T> {
    private final Class<T> targetType;

    public StringToNumber(Class<T> targetType) {
        this.targetType = targetType;
    }

    public T convert(String source) {
        return source.isEmpty() ? null : NumberUtils.parseNumber(source, this.targetType);
    }
}

从上面代码可以分析出,实现类型转换器大体上分为三部

1.获取客户端参数(springMvc 帮我们实现)

2.转换为想要的控制器方法定义的类型参数

3.赋值给控制器方法(springMvc 帮我们实现)

所以我们如果需要自定义类型转换器,编码上 需要自己动手的也只有第二步

那么内置的这些类型转换器,是如何工作的?

各种类型转换器需要一个地方存储他们,也就是FormattingConversionServiceFactoryBean,在其中定义了一个集合去存储各种内置的类型转换器

typescript 复制代码
public void setConverters(Set<?> converters) {
    this.converters = converters;
}

1.在SpringMVC启动时,会通过mvc:annotation-driven/ 把FormattingConversionServiceFactoryBean。引入到SpringMVC体系中

2.FormattingConversionServiceFactoryBean存储了SpringMVC中所有的内置类型转换器

3.后续client提交请求参数时,如果对应控制器方法形参不是字符串类型,那么FormattingConversionServiceFactoryBean就会调用对应的类型转化器,进行类型转换,最终完成控制器方法形参的赋值

自定义

根据上面的描述,可以自己实现一个日期类型转换器

typescript 复制代码
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        Date parse = null;
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            parse = simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }
}

但是springMvc启动后创建FormattingConversionServiceFactoryBean的时候,这里面只有内置类型转换器,我们自定义的日期类型转换器不在其中,也就意味着不会生效

所以,首先需要将自定义的类型转换器 加入到spring容器中

然后注册FormattingConversionServiceFactoryBean 并在其中引入上面自定义的类型转换器

xml 复制代码
<bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <ref bean="converter"/>
        </set>
    </property>
</bean>

最后让mvc启动的时候加载 我们注册的FormattingConversionServiceFactoryBean,也就是包含自定义类型转换器的FormattingConversionServiceFactoryBean

<mvc:annotation-driven conversion-service="formattingConversionService"/>

相关推荐
卷无止境19 分钟前
FastAPI 后台任务的边界,以及 Celery、Redis 与自建调度系统的选择
后端·python
卷无止境22 分钟前
Linux + Docker + FastAPI 工程化实践指南
后端·python·fastapi
AI绘画哇哒哒9 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
唐青枫10 小时前
一个值多种形态:Zig union、Tagged Union 与内存布局实战
后端
卷无止境10 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
Nturmoils10 小时前
备份完不算完,先还原到临时库验一遍
后端
Csvn11 小时前
📊 SQL 入门 Day 22:视图与物化视图
后端·sql
Csvn11 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
2601_9537208212 小时前
【计算机毕业设计】基于Vue与Spring Boot的高校兼职信息服务平台设计与实现
spring boot·后端·课程设计
再吃一根胡萝卜13 小时前
用 Rust 写一个桌面悬浮图标:为什么它比 Python 更适合 AI 桌面工具?
后端