Spring MVC RequestMappingHandlerAdapter

作者:範宗雲 来源:原创 发布时间:2015-04-06 归档:springmvc

开发环境 : JDK 7 Maven 3 Tomcat 7 Spring 4.1.5 Eclipse Luna
RequestMappingHandlerAdapter 负责处理请求参数到处理方法参数的绑定以及数据类型转换等工作。
数据类型转换配置示例
			<!-- 配置数据转换服务 -->
		    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		      <property name="converters">
		        <set>
		          <bean class="org.lychie.converter.DateConverter" p:pattern="yyyy-MM-dd" />
		        </set>
		      </property>
		    </bean>
		    
		    <!-- 配置数据绑定, 依赖数据转换服务进行绑定 -->
		    <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
		      <property name="conversionService" ref="conversionService" />
		    </bean>
		    
		    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		      <property name="webBindingInitializer" ref="webBindingInitializer" />
		    </bean>
			
org.lychie.converter.DateConverter
			import java.util.Date;
			import java.text.DateFormat;
			import java.text.ParseException;
			import java.text.SimpleDateFormat;
			import org.springframework.util.StringUtils;
			import org.lychie.exception.ConverterCastException;
			import org.springframework.core.convert.converter.Converter;
			
			public class DateConverter implements Converter<String, Date> {
			
				private String pattern;
			
				@Override
				public Date convert(String source) {
					if (StringUtils.hasText(source)) {
						DateFormat dateFormat = new SimpleDateFormat(pattern);
						dateFormat.setLenient(false);
						try {
							return dateFormat.parse(source);
						} catch (ParseException e) {
							throw new ConverterCastException(e);
						}
					}
					throw new ConverterCastException("For input : " + source);
				}
			
				public void setPattern(String pattern) {
					this.pattern = pattern;
				}
			
			}
			
Controller
			@RequestMapping(value = "/register", method = GET)
			public String registerDate(ModelMap model, Date date) {
				if (date == null) {
					model.addAttribute("date", "NULL");
				} else {
					DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
					model.addAttribute("date", dateFormat.format(date));
				}
				return "result";
			}
			
spring mvc 支持标准的 UTC 时间格式, 若时间不是标准的 UTC 格式, 需要对其进行转换, 否则会引发 400 异常。
GET /register?date=2015-04-06 --> 2015年04月06日
防止 JSON 数据中文乱码配置示例
			<!-- 配置HTTP消息转换器 -->
		    <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
		      <property name="supportedMediaTypes">
		        <list>
		          <value>text/html;charset=utf-8</value>
		          <value>application/json;charset=utf-8</value>
		        </list>
		      </property>
		    </bean>
		    
		    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		      <property name="messageConverters">
		        <list>
		          <ref bean="stringHttpMessageConverter" />
		        </list>
		      </property>
		    </bean>
			
或 :
			<!-- 配置HTTP消息转换器 -->
		    <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
		      <constructor-arg value="utf-8" />
		    </bean>
		    
		    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		      <property name="messageConverters">
		        <list>
		          <ref bean="stringHttpMessageConverter" />
		        </list>
		      </property>
		    </bean>
			
StringHttpMessageConverter 默认采用 ISO-8859-1 字符集, 中文显示成乱码。解决办法是采用 UTF-8、GBK、GB2312 等兼容中文的字符集。

示例代码下载
spring-mvc-request-mapping-handler-adapter.zip