我使用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问题,请创建一个单元测试,然后逐一执行。