什么时候可以property ?copyProperties静默失败



我使用PropertyUtils.copyProperties()通过反射复制对象的属性,它过去工作得很好。然而最近,它开始不做任何事情。

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

我不知道如何复制这个。对我来说,这种情况经常发生,但这是一个项目,我不能在这里发表。该项目使用Play框架,它做一些字节码操作,所以这可能是罪魁祸首。

有什么建议或想法可以导致这个,或者如何调试?我可以尝试的其他字段复制器也很受欢迎(我以前尝试过一次BeanUtils,但由于一些警告,我现在不记得了,所以切换到PropertyUtils)。

我想我明白了。今天发生在我身上。我只是用它做了一些小测试,它不起作用。下面是代码:

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

我从这个答案中取出代码并运行它,它失败了,因为我有一个只写的字段(只有setter,没有getter)。很可能这就是搞砸PropertyUtils的原因。

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

我给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);
    }
}

Dozer是一个更复杂的豆子复印机,你可能会想试试。

要调试PropertyUtils问题,请创建一个单元测试,然后逐一执行。

相关内容

  • 没有找到相关文章

最新更新