如何在Java中使用Spring[SpEL]将属性从一个Java对象合并到另一个Java对象?

如何在Java中使用Spring[SpEL]将属性从一个Java对象合并到另一个Java对象?,java,spring,spring-el,Java,Spring,Spring El,我正在使用Spring,但对它的所有功能都不太熟悉。正在寻找一种将字段从一个Java对象实例复制到另一个Java对象实例的好方法。我已经看到了,但我要找的是更具体的,所以这里是详细信息: 假设我有两个类p的实例,source和target,它们有getter和setter a、b、c、d以及其他20个。 我想将源的属性复制到目标,但仅复制属性名称列表中的所有属性。源或目标中任何属性的值是多少并不重要。 换句话说,如果列表是{a,b} 那么我只希望发生以下事情: P source; P targe

我正在使用Spring,但对它的所有功能都不太熟悉。正在寻找一种将字段从一个Java对象实例复制到另一个Java对象实例的好方法。我已经看到了,但我要找的是更具体的,所以这里是详细信息:

假设我有两个类p的实例,source和target,它们有getter和setter a、b、c、d以及其他20个。 我想将源的属性复制到目标,但仅复制属性名称列表中的所有属性。源或目标中任何属性的值是多少并不重要。 换句话说,如果列表是{a,b} 那么我只希望发生以下事情:

P source;
P target;
List<string> properties; 

//source, target are populated. properties is {"a", "b"}  
//Now I need some Spring (SpEL?) trick to do the equivalent of:
target.setA(source.getA());
target.setB(source.getB());

我认为SpEL在这里不需要,它可以用。根据您的示例,如果您的类具有属性“a”、“b”、“c”,并且您只想复制前两个,那么您可以这样调用它

BeanUtils.copyProperties(source, target, "c");

希望有帮助

我认为SpEL在这里不需要,它可以用。根据您的示例,如果您的类具有属性“a”、“b”、“c”,并且您只想复制前两个,那么您可以这样调用它

BeanUtils.copyProperties(source, target, "c");
希望有帮助

使用Java反射: 以下是一些关于反射的教程:

不过要小心

使用Spring BeanRapper: Spring BeanRapper示例的功劳归于:

使用Java反射: 以下是一些关于反射的教程:

不过要小心

使用Spring BeanRapper:
Spring BeanRapper示例的功劳是:

可能的重复?可能的重复?那么,在Spring中有没有一种简单的方法可以获得一个类的所有属性的列表?因为我需要这个列表,在调用之前,我需要删除列表中的所有属性copyProperties@inor当然,您只需要反射列表fieldNames=Arrays.asListP.class.getDeclaredFields.stream.mapField::getName.collectCollectors.toList的一点黑魔法;嗨,谢尔盖。谢谢你的回答。我从中学到我需要赶上黑暗魔法。我勾选了你的答案,但我要给@leonz打勾,因为他的答案似乎更有效,因为它不需要遍历所有的元素fields@inor,没关系!我很高兴社区帮助您解决了这个问题。那么,在春季有没有一种简单的方法可以获得一个类的所有属性的列表?因为我需要这个列表,在调用之前,我需要删除列表中的所有属性copyProperties@inor当然,您只需要反射列表fieldNames=Arrays.asListP.class.getDeclaredFields.stream.mapField::getName.collectCollectors.toList的一点黑魔法;嗨,谢尔盖。谢谢你的回答。我从中学到我需要赶上黑暗魔法。我勾选了你的答案,但我要给@leonz打勾,因为他的答案似乎更有效,因为它不需要遍历所有的元素fields@inor,没关系!我很高兴社区帮助你解决了这个问题。谢谢Leonz,给出了非常全面的答案。因为我用的是Spring,所以我用的是你的BeanRapper解决方案。我不得不对最后一行做一个小小的更改,因为我现在只限于Java7。不要把它贴出来。也许你应该…谢谢Leonz,给出了非常全面的答案。因为我用的是Spring,所以我用的是你的BeanRapper解决方案。我不得不对最后一行做一个小小的更改,因为我现在只限于Java7。不要把它贴出来。也许你应该。。。
BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(source);
BeanWrapper destWrap = PropertyAccessorFactory.forBeanPropertyAccess(destination);

properties.forEach(p -> destWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));