У меня есть следующие классы с наследованием:
(я буду иметь дело только с 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, поэтому я очень запутался, как выполнить это преобразование, любые подсказки горячо приветствуются! Спасибо!