Mapstruct для общих объектов

0

Интересно , если это возможно , чтобы написать СТГ , как это (mapstruct картограф для родовых объектов - Я просто хочу , чтобы избежать if statementsс instanceof):

У меня есть карта в моем весеннем компоненте:

public class PushMessageConverter {
private final Map<Class<?>, Function<PushDto, Object>> MAPPER;

private final ObjectMapper objectMapper;
    private final AToAPushDtoMapper aMapper;
    private final BToBPushDtoMapper bMapper;
    private final CToCPushDtoMapper cMapper;

    public PushMessageConverter (ObjectMapper objectMapper, AToAPushDtoMapper aMapper, BToBPushDtoMapper bMapper, CToCPushDtoMapper cMapper) {
        this.objectMapper = objectMapper;
        this.aMapper= aMapper;
        this.bMapper = bMapper;
        this.cMapper = cMapper;

        MAPPER =
                Map.of(
                        A.class, AToAPushDtoMapper ::map,
                        B.class, BToBPushDtoMapper ::map,
                        C.class, CToCPushDtoMapper ::map,
                );
    }

}

где например:

@Mapper(componentModel = "spring")
public interface AToAPushDtoMapper {

    APushDto map(A a); // I want to have here APushDto map(PushDto a); but it doesnt work, because implementation is wrong, without any field mapping
}

и т.п.

и например.

@Data
@ToString
public class APushDto implements PushDto {
    @JsonProperty
    private Long id;

    @JsonProperty(value = "date_from")
    private LocalDateTime dateFrom;

    @JsonProperty(value = "date_to")
    private LocalDateTime dateTo;
}

и A, B, Cявляются объектами, которые должны быть сопоставлены сAPushto, BPushDto, CPushDto

и мой основной метод, который преобразует объекты A, B, C в DTO:

@Override
    protected Map<String, Object> convert(Object entity) {
 Object mappedObject = MAPPER.getOrDefault(entity.getClass(), v -> v)
                .apply((PushDto) entity);
        return convertToJSONMap(mappedObject);
1
  • для отображения дженериков это может быть полезно.
    swabih
    2 дня назад