将继承的 DTO 映射到实体

map inherited DTO to Entity

我有接受继承 DTO 的 RestController:

@JsonSubTypes({
        @JsonSubTypes.Type(value = RealTimeEventDTO.class, name = "real-time"),
        @JsonSubTypes.Type(value = ScheduledEventDTO.class, name = "scheduled")
})
public class EventDTO {

    private Long id;

}

@Data
@NoArgsConstructor
public class RealTimeEventDTO extends EventDTO {

    private EventTriggerDTO eventTrigger;

    @Builder
    public RealTimeEventDTO(Long id, EventTriggerDTO eventTrigger) {
        super(id);
        this.eventTrigger = eventTrigger;
    }
}

我在域中有相同的结构。我需要将 DTO 映射到实体。

 private Event toEvent(EventDTO event) {
        return null;
    }

如何将继承的 DTO 映射到实体?

看看Mapstruct,正确映射实体和dto很有用

Event.java

public class Event {
    private Long id;
    private String content;

   // constructor, getters, setters, toString etc.
}

EventDTO.java

public class EventDTO {
    private Long id;
    private String payload;

   // constructor, getters, setters, toString etc.
}

IEventMapper.java

@Mapper
public interface IEventMapper {

    IEventMapper INSTANCE = Mappers.getMapper(IEventMapper.class);

    @Mapping(source = "payload", target = "content")
    public Event eventDTOToEvent(EventDTO eventDTO);
}

pom.xml

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.2.Final</version>
</dependency>

用法

public class App {
    public static void main(String[] args) {

        EventDTO eventDTO = new EventDTO(123L, "Hello World !");

        Event event = IEventMapper.INSTANCE.eventDTOToEvent(eventDTO);

        System.out.println(event);
        System.out.println(eventDTO);

    }
}

结果

Event {id=123, content='Hello World !'}
EventDTO {id=123, payload='Hello World !'}