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


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