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