Spring中HttpMessageConvert和ConversionService格式轉換器

      首先HttpMessageConvert<T>和ConversionService應該說是不同的兩種東西,前者用於轉換請求信息和響應信息,後者用於對象間的轉換。

一、HttpMessageConvert<T>

      HttpMessageConvert<T>負責將一個請求信息轉換爲一個對象(類型爲T),將對象(類型爲T)轉換爲響應信息。
默認配置Spring時,RequestMappingHandlerAdapter默認配置了以下轉換器:
   (1)StringHttpMessageConverter
   (2)ByteArrayHttpMessageConverter
   (3)SourceHttpMessageConverter
   (4)FormHttpMessageConverter
官方文檔中的說明,更多信息請查看官方文檔。或者見《Spring企業應用開發實踐》一書

該轉換器主要用於請求和響應消息的轉換。

二、ConversionService

    Spring MVC通過反射機制對目標處理方法簽名進行分析,將請求消息綁定到處理方法入參中核心部件是DataBinder。
    數據綁定一般流程:
           ①將ServletRequest對象及處理方法入參對象實例傳給DateBinder。
        ②DataBinder調用轉配在Spring Web上下文中的ConversionService進行數據類型轉換、數據格式化等工作,將ServletRequest中的消息填充到入參對象中。
         ③調用Validator對已經綁定的請求信息數據的入參對象進行數據合法性校驗,生成數據綁定結果BindingResult。BindingResult包含完成綁定的入參對象和相應的校驗錯誤對象。而後將BindingResult中的入參對象及校驗錯誤對象賦給處理方法的入參。

列子,比如我想講一個請求信息中的一個對象轉換爲一個Location對象:

public class Location {

	/**
	 * 經度
	 */
	private double longitude; 
	
	/**
	 * 緯度
	 */
	private double latitude;

	public double getLongitude() {
		return longitude;
	}

	public void setLongitude(double longitude) {
		this.longitude = longitude;
	}

	public double getLatitude() {
		return latitude;
	}

	public void setLatitude(double latitude) {
		this.latitude = latitude;
	}
	
	
}

    請求如下:https://passport.csdn.net?location=longitude:12.21,latitude:23.1

Spring中存在一個處理該請求的control

	@RequestMapping(value = "/")
	String productAdd(Location location){
                System.out.println(location.getLongitude());
                return "XXXXX";
	}

這個地方我們如何將字符串“longitude:12.21,latitude:23.1”自動綁定到入參對象location中呢?這個時候就需要配置自己的格式轉換器了。

配置如下:
springmvc-servlet.xml配置中添加如下:

 <mvc:annotation-driven conversion-service="conversionService"/>       <!-- mvc支持 -->
    <bean id="conversionService"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
            <set>
                <bean class="znck.spring.Converter.Test"/>
            </set>
        </property>
    </bean><!-- 數據格式轉換器 -->
package znck.spring.Converter;

import org.springframework.core.convert.converter.Converter;

import znck.bean.variable.Location;

public class Test implements Converter<String, Location> {

	@Override
	public Location convert(String str) {
		// TODO Auto-generated method stub
		//備用,暫無具體功能
		return null;
	}

}

在Test中編寫響應的轉換代碼即可,Spring會自動根據轉換目標的原類型和目標類型匹配響應的轉換器。

在響應控制器中添加註解@RequestParam("location") Location location 即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章