【问题标题】:Mapstruct - compilation failure when mapping DTOs that extend from base classMapstruct - 映射从基类扩展的 DTO 时编译失败
【发布时间】:2021-01-09 17:23:25
【问题描述】:

我正在尝试映射这个:

public class UserInfoDTO {
    private String addressDto;
}
public class B extends UserInfoDTO {
    private String roleId;
}
public class A extends UserInfoDTO {
    private String groupId;
}

来自:

public class Entity {
    private Address address;
}

地址包含一些字段和“字符串城市”字段。

我想在实体和 DTO 之间进行映射

@Mapper(componentModel = "jsr330")
public interface IUserMapper {
   A aFromEntity (Entity entity); 
   B bFromEntity (Entity entity); 
   
   @Mappings({
            @Mapping(target = "addressDto", source = "entity.address.city")
   })
   UserInfoDTO fromEntity (Entity entity); 
}

但我得到一个编译失败,“无法将属性地址地址映射到字符串 addressDto”。 请帮忙:)

【问题讨论】:

  • 它在我的测试中运行良好,我使用的是mapstruct 1.4.1

标签: java mapstruct


【解决方案1】:

您需要在类中添加 getter 和 setter:

MapStruct 的一般理念是生成看起来尽可能像您自己亲手编写的代码。特别是,这意味着通过普通的 getter/setter 调用而不是反射或类似方法将值从源复制到目标。

MapStruct 1.4.1.Final Reference Guide

更新。如果你使用 Lombok 而不是 getter/setter。

在编译期间不要忘记 annotationProcessorPaths,这样 Lombok 可以生成 getter 和 setter。

Maven 示例:

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>                        
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${org.mapstruct.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                                <version>${org.projectlombok.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok-mapstruct-binding</artifactId>
                                <version>${lombok-mapstruct-binding.version}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>       
            </plugins>
        </pluginManagement>
    </build>

Gradle 示例

dependencies {
   // Lombok
   compileOnly 'org.projectlombok:lombok:1.18.2'
   annotationProcessor 'org.projectlombok:lombok:1.18.2'

   // MapStruct
   compileOnly 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
   annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'

}

【讨论】:

  • 我在所有类上都使用 lombok - Data,AllArgsConstructor,NoArgsConstructor
  • 我更新了我的答案。也许,Lombok 不会生成 getter/setter
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2017-06-18
相关资源
最近更新 更多