使用 Spring 提供的 BeanUtils.copyProperties 将属性复制到 Builder
Copy properties to a Builder with BeanUtils.copyProperties provided by Spring
我正在尝试将 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();
}
}
问题是:spring-beans
提供的 BeanUtils.copyProperties()
不会调用 Pojo2Builder.value(int)
,因为它不是 setter
;
此外 Builder class 通常由 lombok 生成,所以我不能将方法 Pojo2Builder.value(int)
命名为 Pojo2Builder.setValue(int)
.
顺便说一句,我已经使用 commons-beanutils
中的 BeanUtilsBean.copyProperties()
通过注册自定义的 BeanIntrospector
实现了它,但我发现使用 [=20] 复制属性=] 当复制发生在两个 不同的 class 之间时,比使用 spring-beans
贵得多,所以我更喜欢使用 spring-beans
那么是否可以使用 Spring 或其他一些比 commons-beanutils
更高效的实用程序将属性复制到 Builder class ?
如果构建器不遵循 bean 约定,那么它将无法与 bean 实用程序一起使用。
要么更改构建器,要么编写您自己的复制实用程序。
您不仅需要更改方法名称,还需要将其 return 类型更改为 void
(对于构建器而言非常愚蠢)。添加 @Setter
注释会有所帮助,if it was allowed。
如果您需要将值复制到相同 class 的构建器中,那么您可以使用 Lombok 的 toBuilder()
。或者直接使用 @Wither
.
创建对象
如果您需要坚持 bean 约定,那么您可能就不走运了。考虑使用 mapstruct,这应该更灵活。
我正在尝试将 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();
}
}
问题是:spring-beans
提供的 BeanUtils.copyProperties()
不会调用 Pojo2Builder.value(int)
,因为它不是 setter
;
此外 Builder class 通常由 lombok 生成,所以我不能将方法 Pojo2Builder.value(int)
命名为 Pojo2Builder.setValue(int)
.
顺便说一句,我已经使用 commons-beanutils
中的 BeanUtilsBean.copyProperties()
通过注册自定义的 BeanIntrospector
实现了它,但我发现使用 [=20] 复制属性=] 当复制发生在两个 不同的 class 之间时,比使用 spring-beans
贵得多,所以我更喜欢使用 spring-beans
那么是否可以使用 Spring 或其他一些比 commons-beanutils
更高效的实用程序将属性复制到 Builder class ?
如果构建器不遵循 bean 约定,那么它将无法与 bean 实用程序一起使用。
要么更改构建器,要么编写您自己的复制实用程序。
您不仅需要更改方法名称,还需要将其 return 类型更改为 void
(对于构建器而言非常愚蠢)。添加 @Setter
注释会有所帮助,if it was allowed。
如果您需要将值复制到相同 class 的构建器中,那么您可以使用 Lombok 的 toBuilder()
。或者直接使用 @Wither
.
如果您需要坚持 bean 约定,那么您可能就不走运了。考虑使用 mapstruct,这应该更灵活。