在實際開發中。咱們會常常遇到需要對日期格式、數值格式進行轉換的需求。在spring中。咱們可以輕鬆經過註解的方式完畢對數據的格式化處理,比方現在有個User POJO類:
package com.mvc.model;java
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相互轉換。
爲了完畢咱們的需求。咱們需要先了解例如如下知識。web
它使咱們的註解與屬性類型關聯起來。spring
它的定義例如如下:markdown
app
public interface AnnotationFormatterFactory<A extends Annotation> {
//經過此方法獲取(也能理解爲設置)哪些屬性類可以被註解A標註
Set<Class<?>> getFieldTypes(); //獲取特定屬性的格式化輸出器 Printer<?> getPrinter(A annotation, Class<?> fieldType); //獲取特定屬性格式化輸入(解析)器 Parser<?mvc
> getParser(A annotation, Class<?> fieldType); }
繼承自ConversionService,執行時類型轉換和格式化服務接口,提供執行期類型轉換和格式化的支持。ide
其相應存在一個工廠類FormattingConversionServiceFactoryBean,咱們也可以經過其註冊本身定義轉換器。post
它的地位至關於咱們上一篇文章提到的ConversionServiceFactoryBean。咱們將其裝配在的conversion-service屬性中。spa
如下是咱們的實例配置:code
<!-- 經過: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