需求实例引入
在实际开发中。我们会经常遇到须要对日期格式、数值格式进行转换的需求。在spring中。我们能够轻松通过注解的方式完毕对数据的格式化处理,比方如今有个User POJO类:
package com.mvc.model;
import java.util.Date;
public class Person {
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@NumberFormat(pattern = "#.###k")
private Long salary;
//ignore getter and setter
@Override
public String toString() {
return "Person [name=" + name + ", birthday=" + birthday + ", salary="
+ salary + "]";
}
}
我们希望通过上面两个注解。将birthdat如1995-01-01的字符串形式与java.util.Date的日期形式相互转换,将salary如15.000K的字符串形式与Long型的15000相互转换。
为了完毕我们的需求。我们须要先了解例如以下知识。
AnnotationFormatterFactory接口
它使我们的注解与属性类型关联起来。
它的定义例如以下:
public interface AnnotationFormatterFactory<A extends Annotation> {
//通过此方法获取(也能理解为设置)哪些属性类能够被注解A标注
Set<Class<?>> getFieldTypes();
//获取特定属性的格式化输出器
Printer<?> getPrinter(A annotation, Class<?> fieldType);
//获取特定属性格式化输入(解析)器
Parser<?
> getParser(A annotation, Class<?> fieldType);
}
FormattingConversionService
继承自ConversionService,执行时类型转换和格式化服务接口,提供执行期类型转换和格式化的支持。
其相应存在一个工厂类FormattingConversionServiceFactoryBean,我们也能够通过其注冊自己定义转换器。
它的地位相当于我们上一篇文章提到的ConversionServiceFactoryBean。我们将其装配在的conversion-service属性中。
以下是我们的实例配置:
<!-- 通过:annotation-driven的conversion-service属性来装配我们的类型转换器 -->
<mvc:annotation-driven />
<bean
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
id="converters"><!-- 在属性converters注冊 -->
<property name="converters">
<list>
<bean class="com.mvc.convertor.MyConvertorFactory" />
</list>
</property>
</bean>
注冊完后,我们就可以进行我们的web測试:
@Controller
public class PersonController {
@RequestMapping("convert")
public void convert( Person person){
System.out.println(person);
}
}
启动server,我们在游览器中訪问:
控制台相应输出:http://localhost:8080/springMVC/convert?name=myName&birthday=1995-01-01&salary=5.000k
Person [name=myName, birthday=Sun Jan 01 00:00:00 CST 1995, salary=5]
从这里我们看出。成功完毕了请求參数到User对象属性的格式化转换。
还有一方面,假设我们想单独使用格式转化器,也可直接在方法入參中使用注解,看以下实例:
@RequestMapping("convert2")
public void convert2(@DateTimeFormat( pattern = "yyyy-MM-dd") Date date,@NumberFormat( pattern = "#k") Long salary ){
System.out.println(date);
System.out.println(salary);
}
启动server,我们在游览器中訪问:http://localhost:8080/springMVC/convert?
name=myName&birthday=1995-01-01&salary=50k
控制台相应输出:
Sun Jan 01 00:00:00 CST 1995