자바 Beanutils.copy Properties()용법 상세 설명

이것 은 개발 자 변 투척 원고 입 니 다~~~
어제 테스트 작은 언니 가 내 버그 리스트 를 다시 켰 어,emmmm...내 면 OS:대상 의 어떤 속성 유형 을 조정 하 는 간단 한 조작,내 가 어떻게 실 수 를 할 수 있 겠 어,내 냄비 가 아 닐 거 야!!but 아무리 거부 해도 bug 는 고 쳐 야 돼 요.저녁 에 버 전이 나 오 니까 요~
성실 하 게 제 가 그저께 고 친 부분 을 따라 잡 았 습 니 다.네,완벽 합 니 다.아무런 결함 이 없습니다~but success 의 테스트 데이터,인터페이스 반환 결과 가 false 였 습 니 다.그럼 성실 하 게 debug 하 세 요.
한 걸음 한 걸음 따라 와,응,얼마나 잘 되 는 지 내 냄비 가 아니 라 고 해~~어?아니 야,아니 야.여기 ID 값 이 왜 null 이 야?값 진 걸 전해 오 네!!다른 사람 이 bug 를 복구 할 때 Beanutils.copy Properties(obj 1,obj 2)를 사용 한 것 으로 밝 혀 졌 습 니 다.but obj 1 의 속성 이름 id,obj 2 의 속성 이름 after Id,Beanutils.copy Properties()가 처리 하 라 고 요구 한 두 대상 의 속성 이름 이 같 을 때 만 정상적으로 값 을 부여 할 수 있 습 니 다.좋 습 니 다.오늘 은 Beanutils.copy Properties()에 대해 잘 이야기 해 보 겠 습 니 다.
1.소개
BeanUtils 는 자바 반사 와 자성 API 에 대한 포장 을 제공 합 니 다.그 주요 목적 은 반사 체 제 를 이용 하여 자바 빈 의 속성 을 처리 하 는 것 이다.
2.용법
같은 속성 을 가 진 자바 빈 이 두 개 있다 면,하 나 는 Struts 의 PO 대상(영구 대상)과 대응 하 는 ActionForm 이다.예 를 들 어 한 사용자 등록 페이지 에 하나의 User 실체 류 와 하나의 User Action Form 실체 류 가 있 습 니 다.저 희 는 보통 Action 에서 Action Form 에서 PO 대상 을 구성 합 니 다.전통 적 인 방식 은 다음 과 같은 문 구 를 사용 하여 속성 에 대해 하나씩 할당 하 는 것 입 니 다.

//    ActionForm      
 UserActionForm uForm = (UserActionForm) form; 

//     User   
User user = new User(); 
 
//      
user.setUsername(uForm.getUsername); 
user.setPassword(uForm.getPassword); 
user.setAge(uForm.getAge); 
........... 
........... 
 
//     JDBC、   Hibernate      User     
... 
이러한 방법 을 통 해 폼 속성 필드 가 많 고 100,1000,심지어 더 많 으 면 우 리 는 100,1000 줄 set,get 을 쓰 는 것 이 아 닙 니 다.누구 도 이렇게 하 기 를 원 하지 않 는 다.
한편,우리 가 BeanUtils.copy Properties()방법 을 사용 한 후에 코드 의 양 이 크게 줄 었 고 전체 프로그램 도 간결 하고 명랑 하 게 보 였 다.코드 는 다음 과 같다.

//    ActionForm      
UserActionForm uForm = (UserActionForm) form; 

//     User   
User user = new User(); 
 
//    
BeanUtils.copyProperties(user, uForm); 

//     JDBC、   Hibernate      User     
....... 
주:User 와 UserActionForm 사이 에 이름 이 다른 속성 이 존재 한다 면 BeanUtils 는 이 속성 을 처리 하지 않 고 수 동 으로 처리 해 야 합 니 다.예 를 들 면:
User 클래스 에는 createDate 생 성 시간 필드 가 있 고 UserAction Form 에는 이 필드 가 없습니다.BeanUtils.copy Properties()는 이 필드 에 대해 어떠한 처리 도 하지 않 습 니 다.스스로 수 동 으로 처리 해 야 합 니 다.
용법 의 총 결 은 다음 과 같다.

[java] view plain copy print?

BeanUtils.copyProperties("     ", "     "); 
[java] view plain copy print?

PropertyUtils.copyProperties("     ", "     ");
용법 은 사실 매우 간단 하 다.첫 번 째 매개 변 수 는 전환 할 클래스 이 고 두 번 째 매개 변 수 는 전환 후의 클래스 이다.
BeanUtils.copyProperties VS PropertyUtils.copyProperties
둘 의 가장 큰 차 이 는:
BeanUtils.copy Properties 는 유형 전환 을 하고 Property Utils.copy Properties 는 그렇지 않 습 니 다.
유형 전환 이 진 행 된 이상 BeanUtils.copy Properties 의 속 도 는 Property Utils.copy Properties 보다 못 하 다.
따라서 Property Utils.copy Properties 응용 범 위 는 약간 좁 습 니 다.이름과 유형 이 같은 속성 만 copy 합 니 다.이름 은 같 지만 유형 이 다 르 면 잘못 보고 합 니 다.
BeanUtils 를 사용 할 때 주의해 야 할 점 이 몇 가지 있 습 니 다.
1.유형 이 Boolean/Short/Integer/Float/Double 인 속성 에 대해 서 는 0 으로 변 환 됩 니 다.

public class User { 
 
 private Integer intVal; 
  
 private Double doubleVal; 
  
 private Short shortVal; 
  
 private Long longVal; 
  
 private Float floatVal; 
  
 private Byte byteVal; 
  
 private Boolean booleanVal; 
} 
 
User src = new User(); 
User dest = new User(); 
BeanUtils.copyProperties(dest, src); 
System.out.println(src); 
System.out.println(dest); 
 
//    
User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null] 
User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false] 
stackoverflow 에 서 는 이 몇 가지 유형 이 모두 대응 하 는 기본 유형 이 있 기 때문에 유형 전환 을 할 때 Integer->int 와 유사 한 전환 을 만 날 수 있 습 니 다.이 때 는 int 유형의 속성 대 가 를 null 로 할 수 없 기 때문에 0 으로 통일 적 으로 전환 할 수 있 습 니 다.
어떻게 그것 을 0 으로 바 꾸 지 못 하 게 합 니까?이렇게 할 수 있 습 니 다.

import org.apache.commons.beanutils.converters.IntegerConverter; 
 
IntegerConverter converter = new IntegerConverter(null); //   null,   0 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
beanUtilsBean.getConvertUtils().register(converter, Integer.class); 

2.java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time 등 몇 가지 종류 에 대해 값 이 null 이면 copy 에서 이상 을 던 집 니 다.대응 하 는 Conveter 를 사용 해 야 합 니 다.

public class User2 { 
 
 private java.util.Date javaUtilDateVal; 
  
 private java.sql.Date javaSqlDateVal; 
  
 private java.sql.Timestamp javaSqlTimeStampVal; 
  
 private BigDecimal bigDecimalVal; 
 
 private java.sql.Time javaSqlTime; 
 
} 
 
User2 src = new User2(); 
User2 dest = new User2(); 
 
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
 
//        ,    null     ,  :org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal' 
// org.apache.commons.beanutils.converters         Converter,        
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.BigDecimalConverter(null), BigDecimal.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class); 
 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimeConverter(null), java.sql.Time.class); 
 
beanUtilsBean.copyProperties(dest, src); 
System.out.println(src); 
System.out.println(dest); 
BeanUtils 를 사용 하면 이런 변태 적 인 수요 에 자주 부 딪 힐 수 있다.
만약 A 에서 B 로 복사 된다 면:
필요 1:B 의 한 필드 에 값 이 있 으 면 이 필드 는 복사 하지 않 습 니 다.즉,B 에서 이 필드 가 값 이 없 을 때 복사 하 는 것 으로 B 에 대한 보충 값 에 적합 하 다.
필요 2:A 의 한 필드 에 값 이 없 으 면 이 필드 는 복사 하지 않 습 니 다.즉,null 을 B 에 복사 하지 않 는 것 입 니 다.
수요 1 에 대해 이렇게 할 수 있다.

import org.apache.commons.beanutils.BeanUtilsBean; 
import org.apache.commons.beanutils.PropertyUtils; 
 
public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ 
 
 @Override 
 public void copyProperty(Object bean, String name, Object value) 
   throws IllegalAccessException, InvocationTargetException { 
  try { 
   Object destValue = PropertyUtils.getSimpleProperty(bean, name); 
   if (destValue == null) { 
    super.copyProperty(bean, name, value); 
   } 
  } catch (NoSuchMethodException e) { 
   throw new RuntimeException(e); 
  } 
 } 
 
} 
수요 2 에 대해 이렇게 할 수 있다.

import org.apache.commons.beanutils.BeanUtilsBean; 
 
public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean { 
 
 @Override 
 public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { 
  if (value == null) { 
   return; 
  } 
  super.copyProperty(bean, name, value); 
 } 
}
자바 Beanutils.copy Properties()용법 에 대한 자세 한 설명 은 여기까지 입 니 다.자바 Beanutils.copy Properties 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기