代码之家  ›  专栏  ›  技术社区  ›  Željko Tomić

MapStruct是否可以自动检测包含泛型类型作为源和目标的集合的映射?

  •  5
  • Željko Tomić  · 技术社区  · 8 年前

    我最近学习了MapStruct,我非常喜欢它的工作方式。由于我是MapStruct的新手,如果这个问题很愚蠢或毫无意义,我会提前道歉。

    Java 6。

    public class A{
        //...
    }
    public class B extends A{
        //...
    }
    public class C extends A{
        //...
    }
    
    public class ADto{
        //...
    }
    public class BDto extends ADto{
        //...
    }
    public class CDto extends ADto{
        //...
    }
    

    我的映射器定义:

    public abstract ADto mapAToADto(A source);
    
    public abstract A mapADtoToA(ADto source);
    
    public abstract BDto mapBToBDto(B source);
    
    public abstract B mapBDtoToB(BDto source);
    
    public abstract CDto mapCToCDto(C source);
    
    public abstract C mapCDtoToC(CDto source);
    

    目前效果很好。

    List<A> List<ADto> 包含两个子类型的。

    instanceof ,然后调用上面列出的匹配映射方法。

    当前实施:

    public <T extends ADto, S extends A> List<T> toList(List<S> source) {
    if (source == null) {
        return null;
    }
    
    List<T> list = new ArrayList<T>();
    for (S entity : source) {
        if (entity instanceof B) {
            list.add((T) mapBToBDto((B) entity));
        } else if (entity instanceof C) {
            list.add((T) mapCToCDto((C) entity));
        } else {
            list.add((T) mapADtoToA((A) entity));
        }
    }
    
    return list;
    };
    

    我的乐观态度是:

    @IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL)
    public abstract <T extends ADto, S extends A> List<T> listAToADto(List<S> source);
    

    这导致:

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Filip    8 年前

    您的实现是正确的。MapStruct是一个注释处理器,在编译期间生成代码。我们不生成任何反射检查(编译期间,实现和接口或扩展类的所有类型都未知)。因此,你解决问题的方法是正确的。