gpt4 book ai didi

java - 使用 Spring 提供的 BeanUtils.copyProperties 将属性复制到 Builder

转载 作者:行者123 更新时间:2023-12-02 02:45:20 27 4
gpt4 key购买 nike

我正在尝试将 POJO 对象的属性复制到另一个不可变对象(immutable对象)的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类通常由lombok生成所以我不能将方法 Pojo2Builder.value(int) 命名为 Pojo2Builder.setValue(int)

顺便说一句,我已经通过注册自定义的 BeanIntrospector< 在 apache commons 提供的 commons-beanutils 中使用 BeanUtilsBean.copyProperties() 来实现它,但我发现当复制发生在两个不同之间时,使用 commons-beanutils 复制属性比使用 spring-beans 复制属性要昂贵得多类,所以我更喜欢使用 spring-beans 来做到这一点

那么是否可以使用 Spring 或其他一些比 commons-beanutils 更高效的实用程序将属性复制到 Builder 类?

最佳答案

您不仅需要更改方法名称,还需要将其返回类型更改为 void (对于构建器来说相当愚蠢)。添加 @Setter 注释会有所帮助,if it was allowed .

如果您需要将值复制到同一类的构建器中,那么您可以使用 Lombok 的 toBuilder()。或者直接使用@Wither创建对象。

如果您需要遵守 Bean 约定,那么您可能不走运。考虑使用mapstruct ,应该更灵活。

关于java - 使用 Spring 提供的 BeanUtils.copyProperties 将属性复制到 Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44649976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com