Spring5应用之自定义类型转换器

作者简介 :☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页 :Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏 :Spring5应用专栏_Aomsir的博客

前言

在在我们之前的文章中,我们均采用spring配置文件进行开发。不知道大家是否注意到,配置文件里的依赖注入,除了引用类型外,基本都是字符串类型 。但在bean对应的类中,却往往使用如Integer 这样的类型。这背后是如何实现的呢?

类型转换器

Spring想到了这一点,提供了类型转换器 ,通过类型转换器把配置文件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入。如上图

自定义类型转换器

spring为我们提供了很多的类型转换器,比如简单类型转换器 、数组转换器 、集合类型转换器 等等,但还是会有场景需要我们自己进行类型转换,如下String转Date类型

错误分析

我为IoC容器准备了一个实体类、一份配置文件和一个测试方法,代码如下所示。在进行测试时,我遇到了一个异常,提示无法将String类型转换为Date类型 。这表明Spring无法自动执行String到Date的类型转换。为什么Spring不能自动转换呢?实际上,Spring提供了默认的类型转换器,但是只支持格式为yyyy/MM/dd的日期转换,而我们在测试中使用的是yyyy-MM-dd格式,因此需要我们程序员来自定义类型转换器

java 复制代码
public class Person implements Serializable {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
xml 复制代码
<bean id="person" class="com.aomsir.basic.converter.Person">
    <property name="name" value="Aomsir" />
    <property name="birthday" value="2023-09-13" />
</bean>
java 复制代码
public class TestSpring {
    @Test
    public void test12() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        com.aomsir.basic.converter.Person person = ctx.getBean("person", com.aomsir.basic.converter.Person.class);

        System.out.println("person = " + person);
        System.out.println("birthday = " + person.getBirthday());
    }
}

自定义开发

  • 开发步骤

    • 创建转换器类,实现Converter接口
    • 编写spring配置文件进行注册
  • 接口说明

    • 接口中第一个泛型是原类型,第二个泛型是目标类型
    • 接口方法的参数是原数据,返回值是转换好后的对应数据
  • 注意:类型注册器id值必须是conversionService

java 复制代码
public class MyDateConverter implements Converter<String, Date> {

    /**
     * 将字符串类型转换为日期类型
     * @param s
     * @return
     */
    @Override
    public Date convert(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date date = null;
        try {
            date = sdf.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

        return date;
    }
}
xml 复制代码
<bean id="person" class="com.aomsir.basic.converter.Person">
    <property name="name" value="Aomsir" />
    <property name="birthday" value="2023-09-13" />
</bean>

<!--将MyDateConverter创建出来-->
<bean id="myDateConverter" class="com.aomsir.basic.converter.MyDateConverter" />

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <ref bean="myDateConverter" />
        </set>
    </property>
</bean>

参考文献

相关推荐
IT_陈寒7 分钟前
React组件莫名重渲染?你可能忘了这个小细节
前端·人工智能·后端
用户98883218717435 分钟前
给 .NET 网络调用设定“预算”:用 CancellationTokenSource.CancelAfter 处理超时取消
后端
清风儿32939 分钟前
一块不会说话的电表,把我们折腾了半个月
后端
预知同行1 小时前
深入解析 MoE 混合专家模型:从 Router 到 All-to-All 的架构全景与生产实践
后端·架构
upala1 小时前
【仓颉语言入门 · 第二篇 第 8 课】
后端
weiwin1231 小时前
MAF 入门(8):多模态实战——让 Agent 看懂图片、处理混合内容
人工智能·后端
弈栈录2 小时前
流式对话接口设计:SSE、WebSocket 与断线重连
后端
Java内核笔记2 小时前
Spring AI 生产级 Chat 接口:6 个开关、13 个坑,其中 2 个开关根本没生效
java·人工智能·后端
雷一言说2 小时前
Spring AI 2.0 RAG:用 Metadata Filter 做多租户检索隔离
java·spring
是江迪呀2 小时前
向全世界售卖你的产品:做了一款教程引导插件
前端·javascript·后端