java - Mapstruct :有条件地映射字段或忽略
问题描述
我有一堂这样的课:
class StudentDTO {
String name;
Integer rollNo;
List<CourseDTO> coursesTaken;
Boolean isFailed;
List<CourseDTO> failedCourses;
}
我只想failedCourses
在标志为真时将 List 从 StudentDTO 映射到 Student isFailed
,否则忽略该字段,但不在接口中使用默认实现。mapstruct 中是否有任何注释/参数可以帮助我?我试过使用expression
但不能让它工作。
解决方案
有几种方法。但是,他们都写了一些自定义代码来做到这一点:
@Mapper
public interface MyMapper{
@Mapping( target = "failedCourses", ignore = true )
Student map(StudentDTO dto);
List<Course> map(List<CourseDTO> courses);
@AfterMapping
default void map(StudentDTO dto, @MappingTarget Student target) {
if (dto.isFailed() ) {
target.setFailedCourses( map( dto.getFailedCourses() );
}
}
}
您还可以为一个属性制作专用映射并将整个源用作输入。像这样
@Mapper
public interface MyMapper{
@Mapping( target = "failedCourses", source = "dto" )
Student map(StudentDTO dto);
List<Course> map(List<CourseDTO> courses);
default List<Course> map(StudentDTO dto) {
if (dto.isFailed() ) {
return map( dto.courses );
}
}
}
推荐阅读
- python - Pandas - 使用 read_csv 阅读时间
- healthkit - 我们如何将测试 HKClinicalRecord 数据加载到 HealthKit 中?
- c# - 我应该在 2 个 .NET 软件之间使用什么请求/响应通信模式?
- java - 从 java 访问 confluence REST api
- wordpress - 在 WordPress 主题中创建不需要的表单字段
- c# - Microsoft Edge - C# 错误 - 字符串未被识别为有效的日期时间
- javascript - 使用回调Angular 5在异步加载中获取变量
- karma-jasmine - Karma - 父组件规范文件中子组件的模拟属性
- android - 在 Google Play 商店上传 App Bundle (aab) 时收到以下警告
- excel - Vlookup 中的嵌套 Concat 函数不起作用,似乎找不到语法错误