3

PropertyUtils.copyProperties()を使用して、リフレクションを介してオブジェクトのプロパティをコピーしていますが、以前はうまく機能していました。しかし最近、何もしないようになりました。

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

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

これを引き起こしている可能性のあるもの、またはデバッグ方法に関するアドバイスやアイデアはありますか? 私が試すことができる代替のフィールドコピーも大歓迎です (以前に一度 BeanUtils を試しましたが、覚えていないいくつかの警告のために PropertyUtils に切り替えました)。

4

3 に答える 3

2

私はそれを理解したと思います。それは今日私に起こりました。私はそれを使っていくつかの小さなテストを行っていましたが、うまくいきませんでした。コードは次のとおりです。

 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();
    }

}

 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);

}

これは、クラスを公開することで解決しました。たぶんあなたのクラスの1つは公開されていません。私の場合の解決策は次のとおりです。

 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);

}
于 2012-03-22T19:30:41.370 に答える
1

この回答からコードを取得して実行しましたが、書き込み専用フィールド (セッターのみ、ゲッターなし) が原因で失敗しました。これが PropertyUtils を台無しにしている可能性があります。

呼び出すIntrospector.getBeanInfo(MyModel.class).getPropertyDescriptors()と、プロパティの部分的なリストしか返されないことがわかりました。この github リポジトリで再現されています。

問題が解決することを期待して、への呼び出しを追加しましたがIntrospector.flushCaches();、そうではありませんでした。

回避策として、beanutils で応答する代わりにフィールドをコピーする方法を実装しました。

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);
    }
}
于 2011-12-05T13:02:11.863 に答える
0

Dozer は、より洗練された bean-copier であり、ぜひ試してみてください。

PropertyUtils の問題をデバッグするには、単体テストを作成してからステップ実行します。

于 2011-12-05T12:13:51.060 に答える