Я пытаюсь скопировать свойства объекта POJO в Builder другого неизменяемого объекта, например:
public class CopyTest {
// the source object
public static class Pojo1 {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
// the target object
public static class Pojo2 {
private final int value;
public Pojo2(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static Pojo2Builder builder() {
return new Pojo2Builder();
}
// builder of the target object, maybe generated by lombok
public static class Pojo2Builder {
private int value;
private Pojo2Builder() {}
public Pojo2Builder value(int value) {
this.value = value;
return this;
}
public Pojo2 build() {
return new Pojo2(value);
}
}
}
public static void main(String[] args) {
Pojo1 src = new Pojo1();
src.setValue(1);
Pojo2.Pojo2Builder builder = Pojo2.builder();
// this won't work, provided by spring-beans
BeanUtils.copyProperties(src, builder);
Pojo2 target = builder.build();
}
}
Проблема в том, что BeanUtils.copyProperties()
, предоставленный spring-beans
, не будет вызывать Pojo2Builder.value(int)
, потому что это не setter
;
Кроме того, класс Builder обычно генерируется lombok, поэтому я не могу назвать метод Pojo2Builder.value(int)
как Pojo2Builder.setValue(int)
.
Кстати, я уже сделал это, используя BeanUtilsBean.copyProperties()
в commons-beanutils
, предоставленном apache commons, зарегистрировав настроенный BeanIntrospector
, но я обнаружил, что копирование свойств с использованием commons-beanutils
намного дороже, чем с использованием spring-beans
, когда копирование происходит между двумя разными strong> классы, поэтому я предпочитаю делать это с помощью spring-beans
Итак, возможно ли скопировать свойства в класс Builder с помощью Spring или других утилит, которые более эффективны, чем commons-beanutils
?