3

我正在使用PropertyUtils.copyProperties()通过反射复制对象的属性,它曾经运行良好。然而,最近它开始什么都不做。

它不会抛出异常,但不会复制任何字段。目标对象的所有字段都保持为空,尽管源对象中有非空字段。

我不知道如何重现这个。对我来说,它始终如一地发生,但它在一个我不能在这里发布的项目中。该项目使用 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);

}

它解决了这个问题,使课程公开。也许你的一门课不是公开的。这是我的解决方案:

 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

我从这个答案中获取代码并运行它,它失败了,因为我有一个只写字段(只有 setter,没有 getter)。奇怪的是,这就是破坏 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

推土机是您可能想尝试的更复杂的 bean 复制机。

要调试您的 PropertyUtils 问题,请创建一个单元测试,然后逐步完成。

于 2011-12-05T12:13:51.060 回答