返回类型中的未知属性

sin*_*ash 3 jpa java-8 mapstruct playframework-2.4

我试图在我的Play 2.4 Java8 JPA项目中使用mapstruct.我做的步骤:

添加了依赖关系

  "org.mapstruct" % "mapstruct-jdk8" % "1.1.0.Beta1",
  "org.mapstruct" % "mapstruct-processor" % "1.1.0.Beta1"
Run Code Online (Sandbox Code Playgroud)

模型

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;            
    private String fullName;          
    private String email;
}
Run Code Online (Sandbox Code Playgroud)

EmployeeDto

public class EmployeeDto {

    private String full_name;
    private String email;
}
Run Code Online (Sandbox Code Playgroud)

EmployeeMapper

@Mapper
public interface EmployeeMapper {

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

    @Mapping(source = "fullName", target = "full_name")
    EmployeeDto employeeToEmployeeDto(Employee employee);
}
Run Code Online (Sandbox Code Playgroud)

但它给了我一个编译错误

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

错误可能是什么问题?

ene*_*ral 10

其他开发人员的附加案例:如果您使用 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>
Run Code Online (Sandbox Code Playgroud)


小智 8

兄弟姐妹们大家好。

就我而言,要同时使用 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>
Run Code Online (Sandbox Code Playgroud)


Gun*_*nar 6

目标端的bean需要具有映射属性的setter.

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

  • 只是一个小小的补充,如果您使用(或计划使用)`Lombok`,那么可以通过将`Lombok` 的依赖添加到 pom.xml 中的`annotation processor` 来修复此错误。示例:`&lt;path&gt;&lt;groupId&gt;org.projectlombok&lt;/groupId&gt; &lt;artifactId&gt;lombok&lt;/artifactId&gt; &lt;version&gt;${lombok.version}&lt;/version&gt; &lt;/path&gt;` (4认同)