关于 MapStruct 映射的多个问题
Multiple problems regarding MapStruct mapping
我是 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" 的 属性。你是否
意思是 "null"?
- 结果类型未知 属性 "firstName"
com.personal.portfolio.dto.UserDTO。您是说 "null" 吗?
- 源参数中不存在名为 "joiningDate" 的 属性。做过
你是说空"?
- 结果类型未知 属性 "joiningDate"
java.util.List。你是否
意思是 "empty"?
我知道我的设计可能有误,但我故意这样做是为了了解 MapStruct 的工作原理。任何人都可以帮助我理解我在做什么错误吗?
第一个错误是因为 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 添加到对象列表,而不是对象本身。创建一个方法,将单个 Experience 映射到 ExperienceDTO,在此处添加注释并将其从 experienceToExperienceDTO 方法中删除。
所以,我终于可以解决错误了,这里是两个问题的解决方案:-
如@Zlaval 所述,我需要将注解处理器添加到 MapStruct 的构建中,以消除与 FirstName 相关的错误。
并且将 List 映射到 List 我们不需要方法
List<DTOObject> entityListToDTOList(List<EntityObject> entity)
仅,带有 @Mappings
注释(如果需要)的单个实体到 DTO 映射方法就足够了。
将以下标签添加到“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 的新手,因此遇到了一些问题。
我有以下型号 类 :-
@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" 的 属性。你是否 意思是 "null"?
- 结果类型未知 属性 "firstName" com.personal.portfolio.dto.UserDTO。您是说 "null" 吗?
- 源参数中不存在名为 "joiningDate" 的 属性。做过 你是说空"?
- 结果类型未知 属性 "joiningDate" java.util.List。你是否 意思是 "empty"?
我知道我的设计可能有误,但我故意这样做是为了了解 MapStruct 的工作原理。任何人都可以帮助我理解我在做什么错误吗?
第一个错误是因为 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 添加到对象列表,而不是对象本身。创建一个方法,将单个 Experience 映射到 ExperienceDTO,在此处添加注释并将其从 experienceToExperienceDTO 方法中删除。
所以,我终于可以解决错误了,这里是两个问题的解决方案:-
如@Zlaval 所述,我需要将注解处理器添加到 MapStruct 的构建中,以消除与 FirstName 相关的错误。
并且将 List 映射到 List 我们不需要方法
List<DTOObject> entityListToDTOList(List<EntityObject> entity)
仅,带有 @Mappings
注释(如果需要)的单个实体到 DTO 映射方法就足够了。
将以下标签添加到“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>