首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 自定义类型转换器

Spring 自定义类型转换器

作者头像
wsuo
发布2020-09-10 14:44:22
1K0
发布2020-09-10 14:44:22
举报
文章被收录于专栏:技术进阶之路技术进阶之路

什么是类型转换器 ❓

来看下面一个例子:

这里有一个实体类 Person

public class Person {
    private String name;
    private Integer age;
    private Date date;
    
    ...
}

如果我们在配置文件中这么注入的话:

<bean class="edu.lsu.pojo.Person" id="person">
    <property name="name" value="小王"/>
    <property name="date" value="2000-08-21"/>
</bean>

就会报下面的错误 ❌:

看错误的提示信息是因为 String 类型无法转为 Date 类型。

因为我们这里指定的日期格式为 2000-08-21,而 Spring 只支持将 2000/08/21 格式的字符串转化为 Date 类型。

所以才会报错,但是也有解决办法,Spring 也考虑到了这种情况,所以为我们提供了 Converter 接口,我们可以自定义类型转化。而 Converter 接口就是类型转化器。

定义类型转化器

Converter<String, Date>

该接口有两个泛型,第一个泛型指的是原始类型,第二个是目标类型,在我们的案例中是 String 和 Date。

public class MyConverter implements Converter<String, Date> {

    @Override
    public Date convert(String s) {
        Date date = null;
        try {
            date = new SimpleDateFormat("yyyy-MM-dd").parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

使用 SimpleDateFormat 即可实现功能。

然后还需要在 Spring 的配置文件中配置。

  • 首先需要让 Spring 能将类型转换器的对象创建出来;
  • 然后要让 Spring 知道你自定义了类型转换器,所以需要注册类型转换器。
1、	<bean class="edu.lsu.converter.MyConverter" id="myConverter"/>

2、	<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
    	<property name="converters" ref="myConverter"/>
	</bean>

注意这里的第二步的 id 值必须是 conversionService,不然会报错,因为 Spring 会根据这个 id 值创建对象,如果你改了他就找不到了。

再次运行代码就不会出现问题了。

date=Mon Aug 21 00:00:00 CST 2000

对于上面的代码还可以进一步的优化,比如日期格式是经常要变得,所以我们完全可以将格式分离出来,进一步的解耦合。

public class MyConverter implements Converter<String, Date> {

    private String pattern;

    public String getPattern() {
        return pattern;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

    @Override
    public Date convert(String s) {
        Date date = null;
        try {
            date = new SimpleDateFormat(pattern).parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

配置文件修改为:

<bean class="edu.lsu.converter.MyConverter" id="myConverter">
    <property name="pattern" value="yyyy-MM-dd"/>
</bean>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是类型转换器 ❓
  • 定义类型转化器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档