springMVC4(11)使用注解完成數據格式化


需求實例引入

在實際開發中,我們會常常遇到需要對日期格式、數值格式進行轉換的需求。在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);
}
}

啟動服務器,我們在游覽器中訪問:
控制台對應輸出: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);
}

啟動服務器,我們在游覽器中訪問:http://localhost:8080/springMVC/convert?name=myName&birthday=1995-01-01&salary=50k
控制台對應輸出:

Sun Jan 01 00:00:00 CST 1995


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com