2011-12-05 16 views
3

私はPropertyUtils.copyProperties()を使ってオブジェクトのプロパティをリフレクションでコピーしていました。しかし、最近は何もしませんでした。PropertyUtils.copyPropertiesはいつ呼び出すことができますか?

例外は発生しませんが、フィールドはコピーされません。ソースオブジェクトにはnull以外のフィールドがありますが、ターゲットオブジェクトのすべてのフィールドはnullのままです。

これを再現する方法がわかりません。私にとっては一貫して起こりますが、ここで公開できないプロジェクトの中にあります。このプロジェクトではPlay Frameworkが使用されています。これはバイトコード操作を行うため、その原因になる可能性があります。

これを引き起こしている可能性のあるアドバイスやアイデア、デバッグ方法について教えてください。私が試してみることができる代替フィールドコピー機も歓迎しています(以前はBeanUtilsを試してみましたが、PropertyUtilsに切り替えました。

+0

新しいバージョンのbeanutilsにアップグレードしましたか?変更された内容を把握するためにコードを以前のバージョンに戻すことはできますか? – Gray

+0

@Gray - 私はbeanutilsのバージョンを変更していません...何が動作しなくなったのか正確にはわかりません。別に問題を再現しようとしたときにすぐに再現されたので、最初は何が問題になっているのかは分かりません。私の答えをチェックしてください:http://stackoverflow.com/a/8385725/11236 – ripper234

答えて

2

私はそれを考え出したと思う:

は回避策として、私が代わり々BeanUtilsに返信のフィールドをコピーする方法を実装しました。今日私に起こった。私はちょうどそれでいくつかの小さなテストをドンギングしていた、それは動作しませんでした。コードは次のとおりです。

これを解決してクラスを公開しました。多分あなたのクラスの一つが公開されていないかもしれません。私の場合の解決策は次のとおりです。

public static class TesteP { 

    private String a; 
    private String b; 
    private String c; 


    public String getA() { 
     return this.a; 
    } 


    public void setA(String a) { 
     this.a = a; 
    } 


    public String getB() { 
     return this.b; 
    } 


    public void setB(String b) { 
     this.b = b; 
    } 


    public String getC() { 
     return this.c; 
    } 


    public void setC(String c) { 
     this.c = c; 
    } 

    @Override 
    public String toString() { 
     return new ToStringBuilder(this.getClass()).add("a", this.a).add("b", this.b).toString(); 
    } 

} 

public static class RestP { 

    private String a; 

    public String getA() { 
     return this.a; 
    } 

    public void setA(String a) { 
     this.a = a; 
    } 

    @Override 
    public String toString() { 
     return this.a; 
    } 
} 

public static void main(String[] args) 
     throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
    TesteP p = new TesteP(); 
    p.setA("AAAA"); 
    p.setB("BBB"); 
    TesteP pp = new TesteP(); 
    RestP p2 = new RestP(); 
    p2.setA("aaaa"); 
    PropertyUtils.copyProperties(p,p2); 

} 
0

ドーザは、あなたがしようとする場合がありますより洗練された豆の複写機です。

そのステップスルーユニットテストを作成し、あなたのPropertyUtilsの問題をデバッグします。

+0

私の答えを見てください - 問題は私が持っている読み取り専用のプロパティと考えています。私はちょうどこのケースを処理する自分のコードを使用します - それはうまく動作します。 – ripper234

+0

ここに再現:https://github.com/ripper234/Play-doesn-t-work-with-PropertyUtils.copyProperties/blob/master/test/BasicTest.java – ripper234

+0

まあ、プロパティは、フィールドと同じではありませんだから、私はPlayフレームワークの自動生成アクセッサーが選ばれていないと思う。私はあなたがすでにそれを理解したと思う。 – artbristol

1

私はthis answerからコードを取得して実行しましたが、書き込み専用フィールド(setterのみ、ゲッターなし)が原因で失敗しました。これがPropertyUtilsを台無しにしているということは間違いありません。

私はIntrospector.getBeanInfo(MyModel.class).getPropertyDescriptors()を呼び出すことのみプロパティのリストの一部を返すことがわかりました。 this github repositoryに複製されています。

私はそれだけではなかった...この問題を解決することを望んで、Introspector.flushCaches();への呼び出しを追加しました。

public static <T> void copyFields(T target, T source) throws Exception{ 
    Class<?> clazz = source.getClass(); 

    for (Field field : clazz.getFields()) { 
     Object value = field.get(source); 
     field.set(target, value); 
    } 
} 
関連する問題