MapStruct映射对象到列表

时间:2019-07-28 18:43:36

标签: java mapstruct

我正在尝试使用Mapstruct将源对象映射到目标列表。这样做的干净的mapstruct方法应该是什么?

下面是我的DTO。

源DTO

@Data
class Source
{

String a;

String b;

String C;

}

目标DTO

@Data
class Target
{

String name;

List<Child> customList;

}

@Data
class Child
{

String attr1;

boolean attr2;

}

我正面临Mapper类的问题。尝试实现类似以下的功能。

public interface CustomMapper
{

@Mapper(target="customList" expression="java(new Child(a,false))"
@Mapper(target="customList"  expression="java(new Child(b,true))"
@Mapper(target="customList"  expression="java(new Child(c,false))"
Target sourceToTarget(Source source);


}

我不想使用下面的qualifiedBy函数来实现此目的,因为所有转换都需要为每个元素编码。

List<Child> toList(Source source)
{
   List<Child> customList = new ArrayList<Child>();
   customList.add(new Child(source.getA(),false));
   customList.add(new Child(source.getB(),true)); 
   customList.add(new Child(source.getC(),false));

    return customList;
}

3 个答案:

答案 0 :(得分:2)

我有一个类似的用例,我想将Single Object转换为List对象。 由于这些都是非常自定义的要求,因此mapstruct很难为此类用例提供一些API。

我最终像这样使用default method来实现

@Mapper(componentModel = "spring")
interface MyMapper {
    
    default List<SomeObject> from(SourceObject sourceObject) {
      //Add Mappig logic here 
      //return the list

    }
 }

//如果要使用某些映射器进行映射

@Mapper(componentModel = "spring")
public abstract class SomeArrayMapper {

    @Autowired
    SomeMapper mapper;

    public SomeUser[] from(SingleObject singleObject) {
         SomeUsers[] Users = new SomeUser[1];
         
        Users[0] =  mapper.toUser(singleObject);;
        return Users ;
    }
}

在某些情况下,装饰器也很有用,看看here

答案 1 :(得分:0)

在MapStruct中,目前尚无干净的方法。 MapStruct正在考虑将bean tot地图映射。参见此处:https://github.com/mapstruct/mapstruct/pull/1744,一旦实施,可能会有所帮助。

但是,如果您确实有很多属性,并且这是一个反复出现的问题,并且您不喜欢反射(如我一样),则可能需要尝试进行代码生成并进行DIY。我前不久发布了一个用于在此处生成映射器存储库的示例:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-mapper-repo,但是学习曲线有些陡峭。.抱歉

答案 2 :(得分:0)

我用一个表达式来解决这个问题。表达式是执行映射(对于对象,对于字符串是直接的),然后将其转换为列表。

  @Mapping(target = "names", expression = "java(Arrays.asList(map(source.getName())))")
  TargetObject map(SourceObject source);
  
  TargetName map(SourceName source)

您需要在@Mapper定义中导入“ Arrays”类,如下所示。

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring", imports = {Arrays.class})