BeanUtils.copyProperties扩展--实现String转Date

 更新时间:2021年06月16日 10:43:23   作者:风火一回  
这篇文章主要介绍了BeanUtils.copyProperties扩展--实现String转Date操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

BeanUtils.copyProperties(target,source)和PropertyUtils.copyProperties(target,source)都能将源对象的属性的值拷贝到目标对象相同属性名中。

区别在于:

BeanUtils.copyProperties(target,source)

支持基础类型、String、java.sql.Date、java.sql.Timestamp、java.sql.Time之间的类型转换,即只要这些类型的属性名相同那么拷贝就能成功。但是会默认初始化属性值。注意:不支持java.util.Date类型的转化,需手动设置。

PropertyUtils.copyProperties(target,source)

不支持类型转换,但是不会初始话属性值,允许属性值为null。

在webservice中遇到了一个String类型,但是数据库是java.util.Date类型,因为对象属性不较多,所以在使用PropertyUtils.copyProperties(target,source)时报错。

后来查了下资料,说BeanUtils能进行类型转换,故而就自定义了一个String转Date的工具类。

定义工具类

package com.dhcc.phms.common.beanutils;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
public class BeanUtilsEx extends BeanUtils{
  
  static {
      //注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
      ConvertUtils.register(new DateConvert(), java.util.Date.class);
      ConvertUtils.register(new DateConvert(), String.class);
//      BeanUtilsBean beanUtils = new BeanUtilsBean(ConvertUtils.class,new PropertyUtilsBean());
 }
  
 public static void copyProperties(Object target, Object source) throws
        InvocationTargetException, IllegalAccessException {
      //支持对日期copy
 
   org.apache.commons.beanutils.BeanUtils.copyProperties(target, source); 
 }
}

定义日期转换格式

package com.dhcc.phms.common.beanutils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
public class DateConvert implements Converter{
 
 @Override
 public Object convert(Class class1, Object value) {
  if(value == null){
   return null;
  }
  if(value instanceof Date){
   return value;
  }
  if (value instanceof Long) {
   Long longValue = (Long) value;
   return new Date(longValue.longValue());
  }
  if (value instanceof String) {
   String dateStr = (String)value;
   Date endTime = null;
   try {
    String regexp1 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])T([0-2][0-9]):([0-6][0-9]):([0-6][0-9])";
    String regexp2 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9]) ([0-2][0-9]):([0-6][0-9]):([0-6][0-9])";
    String regexp3 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])";
    if(dateStr.matches(regexp1)){
     dateStr = dateStr.split("T")[0]+" "+dateStr.split("T")[1];
     DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     endTime = sdf.parse(dateStr);
     return endTime;
    }else if(dateStr.matches(regexp2)){
     DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     endTime = sdf.parse(dateStr);
     return endTime;
    }else if(dateStr.matches(regexp3)){
     DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
     endTime = sdf.parse(dateStr);
     return endTime;
    }else{
     return dateStr;
    }
   } catch (ParseException e) {
    e.printStackTrace();
   }
  }
  return value;
 }
}

使用时用BeanUtilsEx. copyProperties(target,source)时即可实现String转换为Date。

除此之外,如果需要转换的属性比较少时,可先将source对象中冲突属性取出来,另存一份,然后将该属性值置为null,因为不会拷贝null属性,所以拷贝的时候不会出错。当拷贝完成后再将冲突属性转换为所需格式,set进目标对象。这样也是实现效果。

测试代码如下:

目标对象TargetObject

package test;
import java.util.Date;
public class TargetObject {
 Date date;
 Boolean isOther;
 
 public TargetObject(Date date,Boolean isOther) {
  super();
  this.date = date;
  this.isOther = isOther;
 }
 
 public TargetObject() {
  super();
  // TODO Auto-generated constructor stub
 }
 
 public Date getDate() {
  return date;
 }
 
 public void setDate(Date date) {
  this.date = date;
 }
 
 public Boolean getIsOther() {
  return isOther;
 }
 
 public void setIsOther(Boolean isOther) {
  this.isOther = isOther;
 }
 
 @Override
 public String toString() {
  return "TargetObject [date=" + date + ", isOther=" + isOther + "]";
 }
 
}

源对象SourceObject

package test;
public class SourceObject {
 String date;
 String other;
 
 public SourceObject(String date,String other) {
  super();
  this.date = date;
  this.other = other;
 }
 
 public SourceObject() {
  super();
  // TODO Auto-generated constructor stub
 }
 
 public String getDate() {
  return date;
 }
 
 public void setDate(String date) {
  this.date = date;
 }
 
 public String getOther() {
  return other;
 }
 
 public void setOther(String other) {
  this.other = other;
 }
 
 @Override
 public String toString() {
  return "SourceObject [date=" + date + ", other=" + other + "]";
 } 
}

测试代码

public static void main(String[] args) { 
     SourceObject source = new SourceObject("2017-07-17","false");
     TargetObject target = new TargetObject();
     try {
   BeanUtilsEx.copyProperties(target,source);
   System.out.println(source.toString());//SourceObject [date=2017-07-17, other=false]
   System.out.println(target.toString());//TargetObject [date=Mon Jul 17 00:00:00 CST 2017, isOther=null]
   if(source.getOther().equals("true")) {//对于属性名不一样的属性是不会赋值的,需要手动设置
    target.setIsOther(true);
   }else {
    target.setIsOther(false);
   }
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
    }

BeanUtils.copyProperties 日期转字符 日期转Long

建立自己的日期转换类

import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.lang.time.DateUtils;
 
public class DateConverter implements Converter {
 private static final SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 @Override
 public Object convert(Class type, Object value) {
  if(value == null) {
         return null;
     }
     if(value instanceof Date) {
         return value;
     }
     if(value instanceof Long) {
         Long longValue = (Long) value;
         return new Date(longValue.longValue());
     }
        try {
            return dateFormat.parse(value.toString());
            //return DateUtils.parseDate(value.toString(), new String[] {"yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm" });
        } catch (Exception e) {
            throw new ConversionException(e);
        }
 }
}

使用自己的日期转换类替代默认的。如下面的main函数

public static void main(String[] args) {
                //替换
                ConvertUtils.register(new DateConverter(), Date.class);
  //ConvertUtils.register(new StringConverter(), String.class);
  A a = new A();
  a.date="2012-03-14 17:22:16";
  B b = new B();
  try {
   BeanUtils.copyProperties(b, a);
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println(b.getDate());
 }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 微信公众号获取access_token的方法实例分析

    微信公众号获取access_token的方法实例分析

    这篇文章主要介绍了微信公众号获取access_token的方法,结合实例形式分析了java实现微信公众号获取access_token的相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • MyBatis实现乐观锁和悲观锁的示例代码

    MyBatis实现乐观锁和悲观锁的示例代码

    在数据库操作中,乐观锁和悲观锁是两种常见的并发控制策略,本文主要介绍了MyBatis实现乐观锁和悲观锁的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Spring Cloud灰度部署实现过程详解

    Spring Cloud灰度部署实现过程详解

    这篇文章主要为大家介绍了Spring Cloud灰度部署实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Spring Security 中细化权限粒度的方法

    Spring Security 中细化权限粒度的方法

    这篇文章主要介绍了Spring Security 中细化权限粒度的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 详解在Java程序中运用Redis缓存对象的方法

    详解在Java程序中运用Redis缓存对象的方法

    这篇文章主要介绍了在Java程序中运用Redis缓存对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 解决spring security中遇到的问题

    解决spring security中遇到的问题

    这篇文章主要介绍了解决spring security中遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • JAVA调用JavaScript的方法示例

    JAVA调用JavaScript的方法示例

    本文主要介绍了JAVA调用JavaScript的方法示例,主要介绍了两种方式,一种是使用Java的ScriptEngine接口,另一种是使用Java的URLConnection类来获取JS文件,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java实现猜数字小游戏(有次数限制)

    Java实现猜数字小游戏(有次数限制)

    这篇文章主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java中RocketMq的消费方式详解

    Java中RocketMq的消费方式详解

    这篇文章主要介绍了Java中RocketMq的消费方式详解,RocketMQ的消费方式都是基于拉模式拉取消息的,而在这其中有一种长轮询机制(对普通轮询的一种优化),来平衡上面Push/Pull模型的各自缺点,需要的朋友可以参考下
    2023-10-10
  • java分页之假分页实现简单的分页器

    java分页之假分页实现简单的分页器

    这篇文章主要介绍了java分页之假分页实现简单的分页器的相关资料,需要的朋友可以参考下
    2016-04-04

最新评论