2011-12-27 5 views
1

012.에 방법 setWrappedInstance이 2.5.6에서 있었고 3.0.0에서 제거되었습니다. 2.5에서 3.0으로 프로젝트를 마이그레이션하는 과정에서 오류가 발생합니다. 조사한 결과 구현 클래스 org.springframework.beans.BeanWrapperImpl에 여전히 setWrappedInstance 메서드가 구현되었습니다.Spring 2.5에서 Spring 3.0.5로 마이그레이션

아래 코드는 문제의 원인이되는 프로젝트입니다. 난 그냥 BeanWrapperImpl_bw 구현을 대체 할 경우

public FieldComparator(String fieldName, Class clazz) { 
    _fieldName = fieldName; 
    _bw = new BeanWrapperImpl(clazz); 
}  

public int compare(Object o1, Object o2) { 
    if (o1 == null && o2 == null) return 0; 
    else if (o1 == null) return -1; 
    else if (o2 == null) return 1; 
    // otherwise 
    _bw.setWrappedInstance(o1); 
    Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName); 

    _bw.setWrappedInstance(o2); 
    Comparable v2 = (Comparable) _bw.getPropertyValue(_fieldName); 
    return NullsLowComparator.INSTANCE.compare(v1, v2); 
} 

그래서이 확인 될 것입니다. 나는 학습 단계에 있으며 스프링은 구현 클래스 그 자체보다는 인터페이스를 사용하도록 강력하게 제안한다고 믿는다.

표준 방식에 대한이 변경 사항입니까, 아니면 간단한 변경으로 넘어갈 수 있습니까?

답변

4

BeanWrapper.setWrappedInstance 메서드는 스프링 2.5에서 사용되지 않는 것으로 표시되었으며 3.0에서 모두 제거되었습니다. 제거되지 않는 JRE의 비추천과 달리, Spring에서 사용되지 않는 API는 제거되므로 피하는 것이 좋습니다. setWrappedInstance2.5.6 Javadoc

는 말한다 :

추천되고 있지 않습니다. 필요에 따라 스프링 2.5의 같은 다른 단어에서 BeanWrapper 당 대상 인스턴스

를 다시 대신 BeanWrapper의 인스턴스를 재사용 찬성, 당신은 새로운 BeanWrapperImpl 인스턴스를 생성해야합니다. 성능상의 불이익은 없습니다. BeanWrapperImpljavadoc은 "효율성을 위해 인트로 스펙 션 결과를 캐시합니다"라고 말합니다.

Comparable v1 = (Comparable) new BeanWrapperImpl(o1).getPropertyValue(_fieldName); 

및 전부 _bw 필드 제거하기 :이와

_bw.setWrappedInstance(o1); 
Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName); 

을 :

그래서이를 대체합니다.

는 그 봄이 강하게 네, 엄지 손가락의 일반적으로 인터페이스가 아닌 구현 클래스 자체

를 사용하는 제안 생각합니다. 그러나 이것에 약간의 실용성을 적용 해보십시오. BeanWrapperImpl의 사용은 전적으로 비교기의 내부 구현 세부 사항으로 제한되어 있으므로 직접 사용하는 데 실제적인 해가 없습니다. 비교기가 공용 ​​메서드 시그니처에 BeanWrapper을 노출하는 경우에는 구현 대신 인터페이스를 사용하는 것이 가장 좋습니다.

+0

+1 좋은 설명입니다. 비록 javadoc에서 제안한대로 PropertyAccessorFactory를 사용하는 것이 좋을 것이다. 그것이 언급된다면 당신의 대답은 완벽 할 것입니다. 편집하면 내 것을 지우겠습니다. –

1

는 빈 래퍼를 인스턴스화하는 코드의 점을 감안하고,이 new BeanWrapperImpl() 사용하여 인스턴스화 있다고, 나는 필드 유형 BeanWrapperImpl보다는 BeanWrapper의 경우는 실패 할 수 표시되지 않습니다.

그러나 the javadoc 상태 :

참고 : 봄 2를 사용합니다.5, 이것은 거의 모든 목적을 위해 내부 클래스입니다. 다른 프레임 워크 패키지에서 액세스 할 수 있도록 공개 된 것입니다. 표준 응용 프로그램 액세스 목적으로 PropertyAccessorFactory.forBeanPropertyAccess (java.lang.Object) 팩토리 메소드를 대신 사용하십시오.

따라서 javadoc에서 사용할 것을 제안합니다.

관련 문제