软件编程
位置:首页>> 软件编程>> java编程>> 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

作者:jingxian  发布时间:2023-11-28 20:53:42 

标签:springmvc,类型转换,日期

页面报错:

解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

后台错误:

Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [typeMismatch.user.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birthday,birthday]; arguments []; default message [birthday]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '2013-06-24'; nested exception is java.lang.IllegalArgumentException]

解决方案1:在对应的实体类属性上加入 @DateTimeFormat(pattern = "yyyy-MM-dd")

解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

解决方案2:不使用 <mvc:annotation-driven/>注解

使用 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 注解驱动配置

在对应的实体类属性上加入 @DateTimeFormat(pattern = "yyyy-MM-dd")


<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
     <property name="webBindingInitializer">
       <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
         <property name="conversionService">
           <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/>
         </property>
       </bean>
     </property>
   </bean>

3、使用 @InitBinder注解,注册一个父类Controller(BaseController),其他Controller去继承它


Springmvc配置文件

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

public class BaseController {
 @InitBinder
 public void initBinder(WebDataBinder binder) {
   /**
    * 第一种方式:使用WebDataBinder注册一个自定义的编辑器,编辑器是日期类型
    * 使用自定义的日期编辑器,日期格式:yyyy-MM-dd,第二个参数为是否为空  true代表可以为空
    */
   binder.registerCustomEditor(Date.class, new CustomDateEditor(
       new SimpleDateFormat("yyyy-MM-dd"), true));
 }
}

或者使用下面的方式


public class BaseController {
 @InitBinder
 public void initBinder(WebDataBinder binder) {
   /**
    * 方式二:使用WebDataBinder注册一个自定义的编辑器,编辑器是日期类型
    * 使用属性编辑器实现:重载setAsText,getAsText
    */
   binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {

@Override
     public String getAsText() {
       return new SimpleDateFormat("yyyy-MM-dd")
           .format((Date) getValue());
     }

@Override
     public void setAsText(String text) {
       try {
         setValue(new SimpleDateFormat("yyyy-MM-dd").parse(text));
       } catch (Exception e) {
         e.printStackTrace();
         setValue(null);
       }
     }

});
 }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com