关于 MapStruct 映射的多个问题
Posted
技术标签:
【中文标题】关于 MapStruct 映射的多个问题【英文标题】:Multiple problems regarding MapStruct mapping 【发布时间】:2020-09-12 12:52:53 【问题描述】:我是使用 MapStruct 的新手,因此遇到了一些问题。
我有以下模型类:-
@Data
class User
@Field
private String fullName;
@Field("experience")
private List<Experience> workExperience;
//other fields
@Data
class Experience
private Date joiningDate;
//other fields
现在,我有以下 DTO
@Data
class UserDTO
private String firstName;
private String lastName;
private List<ExperienceDTO> workExperience;
//other fields
@Data
class ExperienceDTO
private String joiningDate;
//other fields
已将 UserMapper 接口编写为:-
@Mapper(componentModel = "spring")
public interface UserMapper
@Mappings(
@Mapping(target = "firstName",source = "fullName",
qualifiedByName = "firstNameExtractor"),
@Mapping(target = "lastName",source = "fullName",
qualifiedByName = "lastNameExtractor")
)
UserDTO userToUserDTO(User user);
@Mappings(
@Mapping(target = "joiningDate", source = "joiningDate",
dateFormat = "yyyy-MM-dd HH:mm:ss")
)
List<ExperienceDTO> experienceToExperienceDTO(List<Experience> experience);
@Named("firstNameExtractor")
public static String getFirstName(String name)
String[] nameParts = name.split(" ");
return nameParts[0];
//similarly have a lastNameExtractor
但我收到以下错误:-
-
源参数中不存在名为“fullName”的属性。你是否
意思是“空”?
结果类型中的未知属性“firstName”
com.personal.portfolio.dto.UserDTO。您指的是“null”吗?
源参数中不存在名为“joiningDate”的属性。做过
你的意思是空的”?
结果类型中的未知属性“joiningDate”
java.util.List。你是否
意思是“空的”?
我知道我的设计可能是错误的,但我故意这样做是为了了解 MapStruct 的工作原理。任何人都可以帮助我了解我在做什么错误?
【问题讨论】:
你是否也生成了Getter/Setter? 是的,使用 Lombok。我已经添加了@Data 注释。 好的,我可以通过将 lombok 工件添加到 lombok 的 来消除与 firstName 相关的错误。但是与日期相关的问题仍然存在。 但正如我所见,您实际上将日期格式传递给非日期类型,您的字符串类型不是日期,您可以尝试将其更改为日期或其他内容吗? 我想将我的日期(在模型中)转换为字符串(在 DTO 中)。我遵循本教程的参考资料:- baeldung.com/mapstruct#Type 【参考方案1】:第一个错误是因为 MapStruct 没有看到 Lombok 注释的方法。 将注解处理器添加到构建中:
<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>
</annotationProcessorPaths>
第二个是您将@Mapping 添加到对象列表中,而不是对象本身。创建一个方法,将单个体验映射到 ExperienceDTO,在其中添加注释并将其从 experienceToExperienceDTO 方法中删除。
【讨论】:
【参考方案2】:所以,我终于可以解决错误,这里是解决这两个问题的方法:-
正如@Zlaval 所述,我需要将注释处理器添加到 MapStruct 的构建中,以消除与 FirstName 相关的错误。
为了将 List 映射到 List,我们不需要方法
List<DTOObject> entityListToDTOList(List<EntityObject> entity)
仅,带有@Mappings
注释(如果需要)的单个实体到 DTO 映射方法就足够了。
【讨论】:
【参考方案3】:将以下标签添加到“maven-compiler-plugin”插件
<configuration>
<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>1.18.20</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.1.0</version>
</path>
</annotationProcessorPaths>
</configuration>
【讨论】:
以上是关于关于 MapStruct 映射的多个问题的主要内容,如果未能解决你的问题,请参考以下文章