2011-12-27 17 views
1

の中に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メソッドは、Spring 2.5では推奨されないとマークされ、3.0では完全に削除されました。 JREの廃止予定(廃止されることはありません)とは異なり、Springの非推奨APIは削除されるため、回避することをお勧めします。

setWrappedInstanceため2.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良い説明です。私は、PropertyAccessorFactoryをjavadocの示唆に基づいて使用することをお勧めします。それが言及されていればあなたの答えは完璧です。それを編集すると私は削除されます。 –

1

は、豆のラッパーをインスタンス化し、あなたのコードだということを考えると、それはnew BeanWrapperImpl()使用してインスタンス化されますことを、私は、フィールドがタイプBeanWrapperImplいうよりBeanWrapperのであれば、それは失敗する可能性がどのように表示されません。

しかし、the javadoc状態:

注:春2のよう。5、これはほとんどの目的のために内部クラス です。 他のフレームワークパッケージからのアクセスを許可するために公開しています。標準アプリケーションへのアクセスの場合、 は、代わりに PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object) ファクトリメソッドを使用します。

したがって、私はjavadocが使用することを示唆しています。

関連する問題