BeanUtils.copy Properties 확장--String 전환 날짜 실현

BeanUtils.copy Properties(target,source)와 Property Utils.copy Properties(target,source)는 원본 대상 의 속성 값 을 대상 의 같은 속성 명 에 복사 할 수 있 습 니 다.
차이 점 은:

BeanUtils.copyProperties(target,source)
기본 형식,String,java.sql.date,java.sql.Timestamp,java.sql.Time 간 의 형식 변환 을 지원 합 니 다.즉,이 유형의 속성 명 이 같 으 면 복사 에 성공 할 수 있 습 니 다.속성 값 을 기본적으로 초기 화 합 니 다.메모:java.util.Date 형식의 전환 은 지원 되 지 않 습 니 다.수 동 으로 설정 해 야 합 니 다.

PropertyUtils.copyProperties(target,source)
형식 변환 은 지원 되 지 않 지만 속성 값 을 초기 화하 지 않 습 니 다.속성 값 을 null 로 허용 합 니 다.
웹 서비스 에서 String 형식 을 만 났 지만 데이터 베 이 스 는 java.util.Date 형식 입 니 다.대상 속성 이 많 지 않 기 때문에 Property Utils.copy Properties(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.copy Properties(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 + "]";
 }
 
}
원본 대상 Source Object

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 날짜 트랜스 퍼 문자 날짜 트랜스 퍼 길이
자신의 날짜 변환 클래스 만 들 기

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());
 }
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기