PropertyUtils.copyProperties何时可以静默失败?

时间:2011-12-05 11:47:47

标签: java reflection playframework apache-commons-beanutils

我正在使用PropertyUtils.copyProperties()通过反射复制对象的属性,并且它曾经运行良好。然而,最近它开始没有做任何事情。

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

我不知道如何重现这一点。对我而言,它始终如一,但它在一个我不能在这里发布的项目中。该项目使用Play Framework,它执行一些字节码操作,因此可能是罪魁祸首。

有关可能导致此问题或如何调试的任何建议或想法?我也可以尝试替代的现场复印机(我之前曾尝试过BeanUtils,但由于我现在还不记得一些警告,我改用了PropertyUtils。)

3 个答案:

答案 0 :(得分: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);

}

答案 1 :(得分:1)

我从this answer获取代码并运行它,因为我只有一个只写字段(仅限setter,没有getter)而失败了。可能的是,这就是搞乱PropertyUtils的原因。

我发现调用Introspector.getBeanInfo(MyModel.class).getPropertyDescriptors()只返回属性的部分列表。转载于this github repository

我添加了对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);
    }
}

答案 2 :(得分:0)

Dozer是您可能想要尝试的更复杂的bean复印机。

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