转载

springmvc参数类型转换三种方式

SpringMVC绑定参数之类型转换有三种方式:

1. 实体类中加日期格式化注解

@DateTimeFormat(pattern="yyyy-MM-dd hh:MM") private Date creationTime;
    2.在Controller类的方法中加入一段代码
/**  * 在controller层中加入一段数据绑定代码  * @param webDataBinder  */ @InitBinder public void initBinder(WebDataBinder webDataBinder) throws Exception{     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");     simpleDateFormat.setLenient(false);     webDataBinder.registerCustomEditor(Date.class , new CustomDateEditor(simpleDateFormat , true)); } 
   备注:自定义类型转换器必须实现PropertyEditor接口或者继承PropertyEditorSupport类
写一个类 extends propertyEditorSupport(implements PropertyEditor){   public void setAsText(String text){    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy -MM-dd hh:mm");   Date date = simpleDateFormat.parse(text);   this.setValue(date);   }   public String getAsTest(){    Date date = (Date)this.getValue();     return this.dateFormat.format(date);   } } 
   3.(spring 3.0以前使用正常,以后的版本需要使用< mvc:annotation-driven/>注册使用)使用xml配置实现类型转换(系统全局转换器)

   1.注册conversionservice

  
<!-- 注册ConversionService-->         <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">             <property name="converters">                 <set>                     <bean class="com.ezubo.global.portal.util.StringToDateConverter">                         <constructor-arg index="0" value="yyyy-MM-dd hh:mm"/>                     </bean>                 </set>             </property>         </bean>
 备注:StringtoDateConverter.java的实现:
/**  * Created by 苏 on 15-10-13.  */ public class StringToDateConverter implements Converter<String,Date> {  private static final Logger logger = LoggerFactory.getLogger(StringToDateConverter.class);  private String pattern;  public StringToDateConverter(String pattern){   this.pattern = pattern;  }  public Date convert(String s) {   if(StringUtils.isBlank(s)){    return null;   }   SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);   simpleDateFormat.setLenient(false);   try{    return simpleDateFormat.parse(s);   }catch(ParseException e){    logger.error("转换日期异常:"+e.getMessage() , e);    throw new IllegalArgumentException("转换日期异常:"+e.getMessage() , e);   }  } } 
   2.使用 ConfigurableWebBindingInitializer 注册conversionService
<!--使用 ConfigurableWebBindingInitializer 注册conversionService-->        <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">             <property name="conversionService" ref="conversionService"/>        </bean>
 3.注册ConfigurableWebBindingInitializer到RequestMappingHandlerAdapter
<!-- 注册ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter-->        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">             <property name="webBindingInitializer" ref="webBindingInitializer"/>             <!-- 线程安全的访问session-->             <property name="synchronizeOnSession" value="true"/>        </bean>
 

此时可能有人会问,如果我同时使用 PropertyEditor 和 ConversionService,执行顺序是什么呢?内部首先查找PropertyEditor 进行类型转换,如果没有找到相应的 PropertyEditor 再通过 ConversionService进行转换。

4.(spring 3.2以后使用正常)使用<mvc:annotation-driven/>注册conversionService

具体原因请参考:

SpringMVC配置全局日期转换器,处理日期转换异常

1.注册ConversionService

<!-- 注册ConversionService-->         <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">             <property name="converters">                 <set>                     <bean class="com.ezubo.global.portal.util.StringToDateConverter">                         <constructor-arg index="0" value="yyyy-MM-dd hh:mm"/>                     </bean>                 </set>             </property>         </bean>

  2. 需要修改springmvc-servlet xml配置文件中的annotation-driven,增加属性conversion-service指向新增的   conversionService。

<mvc:annotation-driven conversion-service="conversionService">  <mvc:message-converters register-defaults="true">   <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">    <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>    <!--转换时设置特性-->    <property name="features">     <array>      <!--避免默认的循环引用替换-->      <ref bean="DisableCircularReferenceDetect"/>      <ref bean="WriteMapNullValue"/>      <ref bean="WriteNullStringAsEmpty"/>      <ref bean="WriteNullNumberAsZero"/>     </array>    </property>   </bean>  </mvc:message-converters> </mvc:annotation-driven> 
已有 0 人发表留言,猛击->> 这里 <<-参与讨论

ITeye推荐

  • —软件人才免语言低担保 赴美带薪读研!—
正文到此结束
Loading...