首页 > 解决方案 > mapstruct:将字段名称映射到属性

问题描述

源类:

class ReportSettings {
    private HeaderSettings headerSettings;
    private FooterSettings footerSettings;

    // getters and setters omitted
}

class HeaderSettings {
    private boolean showLogo;

    // getters and setters omitted
}

class FooterSettings {
    private boolean showPageNumber;

    // getters and setters omitted
}

目标类:

class Parameters {
    private String group;
    private String name;
    private String value;

    // getters and setters omitted
}

是否可以使用 MapStruct 将对象转换为ReportSettings对象, List<Parameters>如下所示,其中类中的字段名称ReportSettings映射到Parameter类的group字段:

group           | name           | value
----------------------------------------
headerSettings  | showLogo       | false
footerSettings  | showPageNumber | true

标签: javamapstruct

解决方案


据我所知,没有这样的功能可以根据字段名称动态创建列表。

我想到的唯一想法是一个真正静态的解决方案,但我猜你有一个动态的字段列表,不能以这种方式做到这一点。

@Mapper
public abstract class ReportSettingsMapper {

  @Mappings({
    @Mapping(target = "group", constant = "headerSettings"),
    @Mapping(target = "name", constant = "showLogo"),
    @Mapping(target = "value", source = "headerSettings.showLogo")
  })
  protected abstract Parameters mapHeaderSettings(ReportSettings settings);

  @Mappings({
    @Mapping(target = "group", constant = "footerSettings"),
    @Mapping(target = "name", constant = "showPageNumber"),
    @Mapping(target = "value", source = "footerSettings.showPageNumber")
  })
  protected abstract Parameters mapFooterSettings(ReportSettings settings);

  public List<Parameters> mapReportSettings(ReportSettings settings) {
    List<Parameters> parameters = new ArrayList<>();
    parameters.add( mapHeaderSettings(settings) );
    parameters.add( mapFooterSettings(settings) );

    return parameters;
  }
}

(未经测试的代码;如果您使用 Java >= 8,则可以使用带有默认方法的接口 + 删除@Mappings容器注释)


推荐阅读