天天看點

Spring中HttpMessageConvert<T>和ConversionService格式轉換器

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

一、HttpMessageConvert<T>

      HttpMessageConvert<T>負責将一個請求資訊轉換為一個對象(類型為T),将對象(類型為T)轉換為響應資訊。

預設配置Spring時,RequestMappingHandlerAdapter預設配置了以下轉換器:

   (1)StringHttpMessageConverter

   (2)ByteArrayHttpMessageConverter

   (3)SourceHttpMessageConverter

   (4)FormHttpMessageConverter

官方文檔中的說明,更多資訊請檢視官方文檔。或者見《Spring企業應用開發實踐》一書

Spring中HttpMessageConvert&lt;T&gt;和ConversionService格式轉換器

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

二、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 即可。