当前位置: 首页 > 知识库问答 >
问题:

扩展现有Mapstruct接口以添加其他映射方法

陶烨赫
2023-03-14
@MapperConfig(uses = MyMapper.class)
public interface MyMapperExtended extends MyMapper {

    default List<ChildClass> someObjectListToChildClassList(List<SomeObject> someList) {
        //Some special logic here and looping which makes it so cannot use the @Mapping annotations
        
        //Call the mapper for the parent so that the base properties are mapped 
        ParentClass mappedParentClass = this.someObjectListToParentClassList(someList);
        
        //Uses a copy constructor to copy over the mapped base properties
        ChildClass myChildClass = new ChildClass(mappedParentClass);
        myChildClass.setExtraProperty("whatever value");

        return myChildClass;
    }
}
@Mapper(imports = { SomeUtilityClass.class })
public interface MyMapper {
    @Mapping(target = "id", source = "someId")
    @Mapping(target = "name", source = "name")
    @Mapping(target = "someFieldWeIgnoreWhileMapping", ignore = true)
    ParentClass someObjectListToParentClass(SomeObject someObject)

    List<ParentClass> someObjectListToParentClassList(List<SomeObject> someList)
}
public class ParentClass {
    UUID id; 
    String name;
    String someFieldWeIgnoreWhileMapping;

    public ParentClass() {}
}

public class ChildClass {
    String extraProperty; 

    public ChildClass(ParentClass parent) {
        super();
        this.setId(parent.getId());
        this.setName(parent.getName());
    }
}
public class SomeObject {
    UUID someId; 
    String name; 
    String someFieldWeIgnore; 

    public SomeObject () {}
}

共有1个答案

湛鸿
2023-03-14

在解决了几个不同的问题之后。我终于让它在生成代码的地方“工作”了,但它不适用于我的用例。我从上面发布的代码中排除了“表达式”的使用,因为我当时认为它不相关,但它导致了最后一个问题。

@Mapping(target = "id", source = "someId")
@Mapping(target = "name", source = "name")
@Mapping(target = "someFieldWeIgnoreWhileMapping", ignore = true)
@Mapping(expression = "java(SomeUtilityClass.doSomethingHelpful(someObject.getSpecialField()))", target = "specialField")
ParentClass someObjectListToParentClass(SomeObject someObject);

从Mapstruct生成的代码如下所示。

public ParentClass someObjectListToParentClass(SomeObject arg0) {
    if (arg0 == null) {
        return null;
    } else { 
        ParentClass parentClass = new ParentClass();
        parentClass.setId(arg0.getId()); 
        parentClass.setName(arg0.getName());

        //The problem. 
        //It puts the variable name as "someObject" because that's what the expression is hardcoded as in the Interface, but the varible is actually arg0 here 
        parentClass.setSpecialField(SomeUtilityClass.doSomethingHelpful(someObject.getSpecialField()));
    }
}

对于没有像我这样的场景的人来说,添加@mapper就可以了(包括所有导入,如果有的话)。我决定只做一个单独的映射器,而不是从原来的映射器继承。

 类似资料:
  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。 BaseEntity: 基础: 没有显示错误,在映射器实现(生成的代码)中没有该ID的映射:

  • 我有一个jar文件,其中有一些映射文件,我想添加作为hibernate.cfg.xml中的映射资源,因为我在org.hibernate.cfg.comfiguration中添加了jar。 在hibernate.cfg.xml中我添加了… 当我执行java应用程序时,我得到了这个异常... 有人能帮我吗?

  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?

  • 问题内容: 在Java中,当接口扩展另一个接口时: 为什么要实现其方法? 当接口不能包含方法主体时,如何实现其方法 当扩展另一个接口而不实现它时,如何实现这些方法? 接口实现另一个接口的目的是什么? 这是Java的主要概念! 编辑: 在eclipse中,除了中的实现方法之外,还有实现符号。 当我将鼠标悬停在它上面时,它表示它实现了该方法!!! 问题答案: 为什么要实现其方法?当接口不能包含方法主体

  • 嗨,到目前为止,我已经能够在简单的类之间进行映射了。现在我必须在接口之间进行映射。假设我有两个接口,其中许多类实现了这些接口。由于我没有了解如何做,我已经映射到特定类型的接口a。现在我需要做反向映射,其中属性可能在子类中,如何在这种情况下做反向映射。我尝试了@ inheritaninverseconfigurationin标签,但没有成功。< br >如果我能得到一些代码片段来理解,而不是阅读描述