我有两个这样的域类。
@Getter
@Setter
public class User {
private String name;
}
@Getter
@Setter
public class Student extends User {
private int grade;
}
我还有两个这样的Dto类
@Getter
@SuperBuilder
public class UserDto {
private final String name;
}
@Getter
@SuperBuilder
public class StudentDto extends UserDto {
private final int grade;
}
所以我做了一个映射器类StudentMapper扩展GenericMapper
public interface GenericMapper<D, E> {
D toDto(E e);
E toEntity(D d);
}
@Mapper(componentModel = "spring")
public interface StudentMapper extends GenericMapper<StudentDto, Student> {
}
但是在编译Mapper时出现了一个错误。
"StudentDto没有可访问的构造函数。">
这些代码有什么问题?
我希望StudentDto是不可修改的。用lombok和mapstruct到达那里的最佳方式是什么?
您可以从这里获得源代码。https://github.com/jangdaewon/sandbox.lombokmapstruct
这有点违反直觉,但是在注释处理器列表中,Lombok必须将放在mapstruct之后。Mapstruct检测Lombok并等待,直到Lombok完全完成它的工作(Lombok可能需要几轮注释处理)。
那么简单地改变<configuration>
/maven-compiler-plugin
/pom.xml
中处理器的顺序,像这样:
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>