使用 Mapstruct 将多个源字段映射到相同类型的目标字段
Map multiple source fields to same type target fields with Mapstruct
考虑以下 POJO:
public class SchedulePayload {
public String name;
public String scheduler;
public PeriodPayload notificationPeriod;
public PeriodPayload schedulePeriod;
}
private class Lecture {
public ZonedDateTime start;
public ZonedDateTime end;
}
public class XmlSchedule {
public String scheduleName;
public String schedulerName;
public DateTime notificationFrom;
public DateTime notificationTo;
public DateTime scheduleFrom;
public DateTime scheduleTo;
}
public class PeriodPayload {
public DateTime start;
public DateTime finish;
}
我使用 MapStruct 创建了一个将 XmlSchedule
映射到 SchedulePayload
的映射器。由于 "business" "logic",我需要将 notificationPeriod
和 schedulePeriod
限制为 Lecture
的 start
和 end
字段值.这是我想出的,使用另一个 class:
@Mapper(imports = { NotificationPeriodHelper.class })
public interface ISchedulePayloadMapper
{
@Mappings({
@Mapping(target = "name", source = "scheduleName"),
@Mapping(target = "scheduler", source = "schedulerName"),
@Mapping(target = "notificationPeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, notificationFrom, notificationTo))"),
@Mapping(target = "schedulePeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, scheduleFrom, scheduleTo))")
})
SchedulePayload map(XmlSchedule xmlSchedule, Lecture lecture);
}
有什么方法可以通过其他方式实现(即另一个映射器、装饰器等)?如何将多个值(xmlSchedule、lecture)传递给映射器?
您可以创建一个 @AfterMapping
方法来手动填充这些部分:
@Mapper
public abstract class SchedulePayloadMapper
{
@Mappings({
@Mapping(target = "name", source = "scheduleName"),
@Mapping(target = "scheduler", source = "schedulerName"),
@Mapping(target = "notificationPeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, notificationFrom, notificationTo))"),
@Mapping(target = "schedulePeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, scheduleFrom, scheduleTo))")
})
public abstract SchedulePayload map(XmlSchedule xmlSchedule, Lecture lecture);
@AfterMapping
protected void addPeriods(@MappingTarget SchedulePayload result, XmlSchedule xmlSchedule, Lecture lecture) {
result.setNotificationPeriod(..);
result.setSchedulePeriod(..);
}
}
或者,您可以将 @AfterMapping
方法放在 @Mapper(uses = ..)
中引用的另一个 class 中,或者您可以使用装饰器(使用 MapStruct 提供的机制,或您的依赖项注入框架,如果你使用的话)。
考虑以下 POJO:
public class SchedulePayload {
public String name;
public String scheduler;
public PeriodPayload notificationPeriod;
public PeriodPayload schedulePeriod;
}
private class Lecture {
public ZonedDateTime start;
public ZonedDateTime end;
}
public class XmlSchedule {
public String scheduleName;
public String schedulerName;
public DateTime notificationFrom;
public DateTime notificationTo;
public DateTime scheduleFrom;
public DateTime scheduleTo;
}
public class PeriodPayload {
public DateTime start;
public DateTime finish;
}
我使用 MapStruct 创建了一个将 XmlSchedule
映射到 SchedulePayload
的映射器。由于 "business" "logic",我需要将 notificationPeriod
和 schedulePeriod
限制为 Lecture
的 start
和 end
字段值.这是我想出的,使用另一个 class:
@Mapper(imports = { NotificationPeriodHelper.class })
public interface ISchedulePayloadMapper
{
@Mappings({
@Mapping(target = "name", source = "scheduleName"),
@Mapping(target = "scheduler", source = "schedulerName"),
@Mapping(target = "notificationPeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, notificationFrom, notificationTo))"),
@Mapping(target = "schedulePeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, scheduleFrom, scheduleTo))")
})
SchedulePayload map(XmlSchedule xmlSchedule, Lecture lecture);
}
有什么方法可以通过其他方式实现(即另一个映射器、装饰器等)?如何将多个值(xmlSchedule、lecture)传递给映射器?
您可以创建一个 @AfterMapping
方法来手动填充这些部分:
@Mapper
public abstract class SchedulePayloadMapper
{
@Mappings({
@Mapping(target = "name", source = "scheduleName"),
@Mapping(target = "scheduler", source = "schedulerName"),
@Mapping(target = "notificationPeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, notificationFrom, notificationTo))"),
@Mapping(target = "schedulePeriod", expression = "java(NotificationPeriodHelper.getConstrainedPeriod(xmlSchedule, scheduleFrom, scheduleTo))")
})
public abstract SchedulePayload map(XmlSchedule xmlSchedule, Lecture lecture);
@AfterMapping
protected void addPeriods(@MappingTarget SchedulePayload result, XmlSchedule xmlSchedule, Lecture lecture) {
result.setNotificationPeriod(..);
result.setSchedulePeriod(..);
}
}
或者,您可以将 @AfterMapping
方法放在 @Mapper(uses = ..)
中引用的另一个 class 中,或者您可以使用装饰器(使用 MapStruct 提供的机制,或您的依赖项注入框架,如果你使用的话)。