Spring MVC中自定义类型转换器

139 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天

自定义类型转换器

Spring MVC默认提供了一些常用的类型转换器,这些类型转换器,可以将用户端提交的参数自动转换为处理器形参类型的数据。然而默认类型转换器并不能将提交的参数转换为所有的类型。此时,就需要开发者自定义参数转换器,来将参数转换为程序所需要的类型。

Converter接口

Spring框架提供了org.springframework.core.convert.converter.Converter接口作为类型转换器,开发者可以通过实现Converter接口来自定义类型转换器

public interface Converter<S, T>{
    T convert(S source);
}

在上述代码中,泛型参数中的S表示源类型,T表示目标类型,而convert()方法将源类型转换为目标类型返回,方法内的具体转换规则可由开发者自行定义。

例:

创建DateConverter类,并在类中定义convert()方法,实现String类型转到Date类型的转换。

public class DateConverter implements Converter<String, Date>{
    private String datePattern = "yyyy-MM--dd";//定义日期格式
    @Override
    public Date convert(String source){
        SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
        try{
            return sdf.parse(source);
        } catch(Exception e){
            throw new illegalArgumentException("无效的日期格式,请使用这种格式:" + datePattern);
        }
    }
}

创建好之后记得要在spring-mvc.xml配置文件中进行配置

<!--配置类型转换器工厂-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!--给工厂注入一个新的类型转换器-->
    <property name="converters">
        <array>
            <!--配置自定义类型转换器-->
            <bean class="com.hexiaoxing.convert.DateConverter"/>
        </array>
    </property>
</bean>
<!--装载转换器-->
<mvc:annotation-driven conversion-service="conversionService"/>

要将自定义类型转换器注册到程序中,除了可以将自定义转换器配置在类型转换器工厂ConversionServiceFactoryBean中,也可以将自定义转换器配置在格式化工厂org.springframework.format.support.FormattingConversionServiceFactoryBean中,通过格式化工厂对数据进行格式化

创建及配置好之后,就可以定义方法做绑定数据示例啦

@RequestMapping("/getBirthday")
public void getBirthday(Date birthday){
    System.out.println("birthday = " + birthday);
}

使用链接后加getBirthday?birthday=2020-11-11来调用方法传入数据,程序就会自动将传入的字符串转换成日期类型

注解简化配置

除了XML方式之外,还可以通过@DateTimeFormat注解来简化日期类型的格式转换。使用该注解完成日期类型的转换无需自定义转换器,也无需在配置文件中自定义转换器工厂或格式化工厂,只需要将@DateTimeFormat定义在方法的形参前面或成员变量上方,就可以为当前参数或变量指定类型转换规则。

使用方式:

@RequestMapping("/getBirthday")
public void getBirthday(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
    System.out.println("birthday = " + birthday);
}

注意:

注解方式的类型转换依赖注解驱动的支持,在spring-mvc.xml配置文件中必须显式定义👇

<mvc:annotation-driven/>