我正在使用PropertyUtils.copyProperties()通过反射复制对象的属性,并且它曾经运行良好。然而,最近它开始没有做任何事情。
它不会抛出异常,但不会复制任何字段。尽管源对象中存在非空字段,但目标对象的所有字段都保持为空。
我不知道如何重现这一点。对我而言,它始终如一,但它在一个我不能在这里发布的项目中。该项目使用Play Framework,它执行一些字节码操作,因此可能是罪魁祸首。
有关可能导致此问题或如何调试的任何建议或想法?我也可以尝试替代的现场复印机(我之前曾尝试过BeanUtils,但由于我现在还不记得一些警告,我改用了PropertyUtils。)
答案 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问题,请创建一个单元测试,然后逐步完成。