9

我正在尝试在我的 Play 2.4 Java8 JPA 项目中使用 mapstruct。我已经完成的步骤:

添加依赖项

  "org.mapstruct" % "mapstruct-jdk8" % "1.1.0.Beta1",
  "org.mapstruct" % "mapstruct-processor" % "1.1.0.Beta1"

模型

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;            
    private String fullName;          
    private String email;
}

员工Dto

public class EmployeeDto {

    private String full_name;
    private String email;
}

员工映射器

@Mapper
public interface EmployeeMapper {

    EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);

    @Mapping(source = "fullName", target = "full_name")
    EmployeeDto employeeToEmployeeDto(Employee employee);
}

但它给了我一个编译错误

 error: Unknown property "full_name" in return type.
[error]     @Mapping(source = "fullName", target = "full_name")

错误可能是什么问题?

4

4 回答 4

14

其他开发人员的附加案例:如果您使用 Lombok,maven 仅使用 MapStruct 处理器。所以 Lombok 不能生成 getter/setter。要解决此问题,请在annotationProcessorPaths.

此外,如果您使用 Lombok 1.8.16 及更高版本,您也必须添加lombok-mapstruct-binding

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${compiler-plugin.version}</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</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>${projectlombok.version}</version>
            </path>
            <!-- This is needed when using Lombok 1.8.16 and above -->
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-mapstruct-binding</artifactId>
                <version>0.1.0</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
于 2020-12-16T12:57:42.583 回答
10

目标端的 bean 需要具有映射属性的设置器。

MapStruct 不使用反射来获取或设置映射类型中的状态,在生成的代码中使用普通的 getter/setter 调用将状态从源传播到目标。

于 2016-07-07T14:54:18.560 回答
4

兄弟姐妹们好。

就我而言,要同时使用 Mapstruct(0.2.0) 和 Lombok(1.18.16),下面的块应该排在前面或位于三个“路径”块的中间。我的意思是 1)mapstruct、2)lombok-mapstruct-binding 和 3)lombok 或 1)lombok-mapstruct-binding、2)mapstruct 和 3)lombok 为我工作。

<path>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok-mapstruct-binding</artifactId>
   <version>0.2.0</version>
</path>
于 2021-01-11T04:09:56.347 回答
0

来自https://mapstruct.org/faq/的相关信息

我可以将 MapStruct 与 Project Lombok 一起使用吗?

是的,从 MapStruct 1.2.0.Beta1 和 Lombok 1.16.14 开始。

Project Lombok 是一个注释处理器,它(除其他外)将 getter 和 setter 添加到已编译 bean 类的 AST(抽象语法树)中。Java 注释处理 API 没有预见到 AST 修改,因此在 Lombok 和 MapStruct 中需要相当多的技巧才能使它们一起工作。本质上,MapStruct 将等到 Lombok 完成所有修改后,才会为 Lombok 增强的 bean 生成映射器类。

可以在此处找到一起使用这两个项目的示例。

如果您使用的是 Lombok 1.18.16 或更新版本,您还需要添加 lombok-mapstruct-binding 以使 Lombok 和 MapStruct 一起工作。

如果您使用的是旧版本的 MapStruct 或 Lombok,则解决方案是将要由 Lombok 修改的 JavaBean 和要由 MapStruct 处理的映射器接口放入项目的两个单独模块中。然后Lombok会在第一个模块的编译中运行,导致在第二个模块的编译过程中MapStruct运行时bean类就完成了。

于 2022-01-06T10:00:48.063 回答