ModelMapper с наследованием - PullRequest
       35

ModelMapper с наследованием

0 голосов
/ 15 марта 2020

У меня есть следующие классы с наследованием:

  • Поворот
    • RegularTurn
      • LinearTurn
      • CircularTurn
    • AlteredTurn
      • TwistedTurn

(я буду иметь дело только с LINEAR в этом вопросе, чтобы сделать его короче)

Использование следующих перечислений:

public enum TurnType {
    REGULAR,
    ALTERED
}
public enum RegularType {
    LINEAR,
    CIRCULAR
}

Модели:

public abstract class Turn implements Serializable {

    private TurnType type; // REGULAR or ALTERED
    private long date;

    protected Turn(String type) { this.type = TurnType.valueOf(type); }

    public abstract String getType();
    public void setType(TurnType type) { this.type = type; }

    public long getDate() { return this.date; }
    public void setDate(long date) { this.date = date; }
}
public abstract class RegularTurn extends Turn {

    public static final String TURN_TYPE = "REGULAR";

    private RegularType regularType; // LINEAR or CIRCULAR

    public RegularTurn(RegularType regularType) {
        super(TURN_TYPE);
        this.regularType = regularType;
    }

    public RegularType getRegularType() { return regularType; }

    public void setRegularType(RegularType regularType) { this.regularType = regularType; }
}
public class LinearTurn extends RegularTurn {

    private Integer angle;

    public LinearTurn() {
        super(RegularType.LINEAR);
    }

    public Integer getAngle() { return angle; }
    public void setAngle(Integer angle) { this.angle = angle; }
}

и их Dto:

public class LineaTurnDto extends RegularTurnDto {

    private Integer angle;

    public LineaTurnDto() {
        super(RegularType.LINEAR);
    }

    public Integer getAngle() { return angle; }
    public void setAngle(Integer angle) { this.angle = angle; }
}

(RegularTurnDto extends TurnDto, который расширяет Serializable)


Использование этого десериализатора:

public class TurnDeserializer extends StdDeserializer<Turn> {

    public TurnDeserializer() {
        this(null);
    }

    public TurnDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Turn deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {

        ObjectMapper mapper = (ObjectMapper) jp.getCodec();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        JsonNode node = jp.getCodec().readTree(jp);

        switch (Turn.valueOf(node.get("type").asText())) {

            case REGULAR:

                switch (RegularType.valueOf(node.get("regularType").asText())) {

                    case LINEAR:
                        return mapper.treeToValue(node, LinearTurn.class);

                    // other regular cases (circular)
                }

            // other cases (altered)

        }
    }
}

Я полностью борюсь с ModelMapper для отображения LinearTurn к LinearTurnDto, я попытался ответить на в этом сообщении , и в настоящее время я пробовал это в моей ModelMapperConfiguration:

@Configuration(value = "cycle")
public class ModelMapperConfiguration {

    @Autowired
    private ModelMapper modelMapper;

    @PostConstruct
    public void initModelMapper() {


        modelMapper
                .createTypeMap(Turn.class, TurnDto.class)
                .include(LinearTurn.class, LinearTurnDto.class);

        modelMapper
                .typeMap(Turn.class, TurnDto.class)
                .setProvider(request -> modelMapper.map(request.getSource(), TurnDto.class));

        modelMapper.addMappings(new PropertyMap<LinearTurn, LinearTurnDto>() {
            @Override
            protected void configure() {
                map().setDate(source.getDate());
                map().setAngle(source.getAngle());
            }
        });

Когда я выполняю modelMapper.map(turn, TurnDto.class);, я все еще заканчиваю с этой ошибкой: 1) Failed to instantiate instance of destination io.cycle.dto.TurnDto. Ensure that io.cycle.dto.TurnDto has a non-private no-argument constructor.

Я незнаком с ModelMapper, поэтому я очень запутался, как выполнить это преобразование, любые подсказки горячо приветствуются! Спасибо!

...