首先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 即可。