如何覆盖属性(如果存在),否则将其保留在java对象中

iibxawm4  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(154)

如果我们具有两个类A和B的两个对象a和b,

public class A{
    String prop1;
    String prop2;
    String prop3;
    String prop4;
    
   public A(String prop1, String prop2, String prop3, String prop4) {
        this.prop1 = prop1;
        this.prop2 = prop2;
        this.prop3 = prop3;
        this.prop4 = prop4;
    }

    public A() {
    }
   //... setters and getters
    }



    public class B{
    String prop2;
    String prop3;

public B(String prop2, String prop3) {
        this.prop1 = prop1;
        this.prop2 = prop2;
        this.prop3 = prop3;
        this.prop4 = prop4;
    }

    public B() {
    }

    }

A a = new A("prop1","prop2","prop3","prop4");
B b = new B();
b.setProp3("p");

我们如何将非空属性从B复制到a?在上面的例子中,我们如何复制不为空的prop3并忽略为空的prop2。

mf98qq94

mf98qq941#

您可以使用MapStruct。
这是一个非常容易使用的库,你可以把所有的属性从一个类复制到另一个类。

@Mapper
public interface AToBMapper {
    A toB(A a);
    B toA(B b);
}

A a = new A("prop1","prop2","prop3","prop4");
B = mapper.toB(a);

当需要将属性从DTO复制到实体时,这非常有用。
如果您不想创建新对象,而是想更新现有对象,也可以按如下所示操作:MapStruct: How to map to existing target?
更多的例子在这里:https://www.baeldung.com/mapstruct

iyzzxitl

iyzzxitl2#

可以使用反射或BeanUtils这样的库来实现这一点,但也可以考虑使用KISS原则,只为它编写一个简单的方法:

public void copyToA(A a, B b) {
  if (b.getProp2() != null) a.setProp2(b.getProp2());
  if (b.getProp3() != null) a.setProp3(b.getProp3());
}

使用BeanUtils,您可以扩展BeanUtilsBean以覆盖copyProperty并检查值是否为空,然后像这样使用它:

var beanUtilsBean = new YourBeanUtilsBean();
beanUtilsBean.copyProperties(a, b);

有关更多信息,请查看此答案https://stackoverflow.com/a/3521314/11480721

相关问题