如何使用 Spring [SpEL] 将一个 Java 对象的属性合并到 Java 中的另一个对象?
how to merge properties from one Java object to another in Java using Spring [SpEL]?
我正在使用 Spring 但不是很熟悉它的所有功能。寻找一种将字段从一个 Java 对象实例复制到另一个对象实例的好方法。我看过 How to copy properties from one Java bean to another? 但我要找的更具体,所以这里是详细信息:
假设我有一些 class P 的两个实例,源和目标,它们有 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,可以用BeanUtils.copyProperties(Object, Object, String...)解决。根据您的示例,如果您的 class 具有属性 'a'、'b'、'c' 并且您只想复制前两个,则可以这样调用它
BeanUtils.copyProperties(source, target, "c");
希望对您有所帮助!
使用Java反射:
Field[] fields = source.getClass().getDeclaredFields();
for (Field f: fields) {
if (properties.contains(f.getName())) {
f.setAccessible(true);
f.set(destination, f.get(source));
}
}
这里有一些关于反射的教程:
http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
http://tutorials.jenkov.com/java-reflection/index.html
不过要小心,Reflection has specific use cases。
使用 Spring BeanWrapper:
BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(source);
BeanWrapper destWrap = PropertyAccessorFactory.forBeanPropertyAccess(destination);
properties.forEach(p -> destWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));
Spring BeanWrapper 示例的功劳转到:
我正在使用 Spring 但不是很熟悉它的所有功能。寻找一种将字段从一个 Java 对象实例复制到另一个对象实例的好方法。我看过 How to copy properties from one Java bean to another? 但我要找的更具体,所以这里是详细信息:
假设我有一些 class P 的两个实例,源和目标,它们有 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,可以用BeanUtils.copyProperties(Object, Object, String...)解决。根据您的示例,如果您的 class 具有属性 'a'、'b'、'c' 并且您只想复制前两个,则可以这样调用它
BeanUtils.copyProperties(source, target, "c");
希望对您有所帮助!
使用Java反射:
Field[] fields = source.getClass().getDeclaredFields();
for (Field f: fields) {
if (properties.contains(f.getName())) {
f.setAccessible(true);
f.set(destination, f.get(source));
}
}
这里有一些关于反射的教程:
http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
http://tutorials.jenkov.com/java-reflection/index.html
不过要小心,Reflection has specific use cases。
使用 Spring BeanWrapper:
BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(source);
BeanWrapper destWrap = PropertyAccessorFactory.forBeanPropertyAccess(destination);
properties.forEach(p -> destWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));
Spring BeanWrapper 示例的功劳转到: