开启掘金成长之旅!这是我参与「掘金日新计划 · 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/>