如何映射对象包含其他对象

时间:2018-02-13 11:23:00

标签: java mapstruct

给定如下定义的Source类:

class Source{
    private String name;
    private int age;
    Phone phone
    // getters and setters
}

和Phone类定义如下:

class Phone{
        private Long id;
        private String phoneNumber;
        // getters and setters
    }

和Target类定义如下:

class Target{
    private String name;
    private int age;
    private Long phone;
    // getters and setters
}

我有一个界面:

@Mapper
interface MyMapper{
    @Mapping(source = "phone.id", target = "phone")
    Target toTarget(Source source);
    @Mapping(source = "phone", target = "phone.id")
    Source toSource(Target target);
}

当id为null时,如何更改生成的代码以消除Phone对象,

生成代码;

source.setPhone(target t){
  if(t==null){
     return null;
  }
Phone f=new Phone();
if(t.getPhone!=null){
    f.setId(t.getPhone();
}
return f;
//in this case mapstruct create an object, even if the source is null
}

1 个答案:

答案 0 :(得分:0)

目前MapStruct中无法实现。已经有类似这样的功能请求(请参阅#1166)。

实现此目标的唯一方法是使用@AfterMapping,如果ID为null,则将手机设置为null

您可以通过以下方式使用@AfterMapping

@Mapper
public interface MyMapper {

    Source map(Target target);

    @AfterMapping
    void afterMapping(@MappingTarget Source source) {
        if (source.getPhone() != null && source.getPhone().getId() == null) {
            source.setPhone(null);
        }
    }
}