자바 Beanutils.copy Properties()용법 상세 설명
7677 단어 자바Beanutils.copyProperties
어제 테스트 작은 언니 가 내 버그 리스트 를 다시 켰 어,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 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.