Создание нескольких дочерних dtos в одной пружинной загрузке
Итак, у меня есть VehicleDto:
class VehicleDto {
private String someId
private String vType;
private CarDto car;
private BikeDto bike;
}
Мне нужно, чтобы 9X_spring-boot в полезных данных запроса был либо CarDto, либо 9X_spring-framework BikeDto.
В полезных данных почтового запроса 9X_j2se будет несколько полей, которые являются 9X_oraclejdk свойствами VehicleDto, например, здесь someId. Теперь 9X_jdk этот someId также является частью CarDto 9X_spring-framework и BikeDto, а также любого другого Dto, являющегося 9X_spring-config дочерним элементом VehicleDto.
Поэтому, когда 9X_core-java я пытаюсь сохранить в базе данных, у меня 9X_javax возникают некоторые проблемы.
if (vehicleDto.getVType().equals("CAR")) {
this.saveCar(vehicleDto);
}
private boolean saveCar(TicketSoldCreateDto ticketSoldCreateDto) {
CarDto carDto = ticketSoldCreateDto.getCar();
carDto is mapped to Car model
// Now how do I map the rest of the fields in vehicleDto to Car model??
}
Автомобиль 9X_spring-config суперкласса:
@MappedSuperclass
@Data
public abstract class Vehicle extends AbstractBaseEntity {
// fields same as vehicleDto
}
Дочерний класс Car:
@Entity
@Data
public class Car extends Vehicle {
// Some fields
}
Как мне разработать 9X_java-libraries такие задачи?
Ответ #1
Ответ на вопрос: Создание нескольких дочерних dtos в одной пружинной загрузке
Почему бы не использовать наследование вместо 9X_spring-java-config ассоциации для DTO, как и для сущностей? А 9X_java-libraries затем сопоставьте эти DTO с объектами и 9X_jre обратно с помощью какого-нибудь картографа 9X_j2se (я предпочитаю mapstruct).
Я сделал полный пример 9X_javax on github.
DTO:
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = CarDto.class, name = "car"),
@JsonSubTypes.Type(value = BikeDto.class, name = "bike")
})
public class VehicleDto {
private Long id;
private String type;
private Integer modelYear;
}
@Data
public class BikeDto extends VehicleDto {
private String frameType;
}
@Data
public class CarDto extends VehicleDto {
private Boolean isCabriolet;
}
@JsonTypeInfo и @JsonSubTypes необходимы для автоматического 9X_jre определения типа DTO в Controller
. Мой пример контроллера 9X_spring-framework получает VehicleDto
и пытается сохранить его в базе 9X_core-java данных как объект Bike
с DtoMapper
и VehicleService
. Последний шаг 9X_java - он снова считывает его из базы данных 9X_spring и отвечает BikeDto
.
@Controller
public class SampleController {
@Autowired
private VehicleService vehicleService;
@Autowired
private DtoMapper mapper;
@PostMapping("/testDto")
@ResponseBody
@Transactional
public BikeDto testDto(@RequestBody VehicleDto vehicleDto) {
if (vehicleDto instanceof BikeDto)
vehicleService.saveBike(mapper.toBikeEntity((BikeDto) vehicleDto));
return mapper.toBikeDto(vehicleService.getBike(vehicleDto.getId()));
}
}
Для DtoMapper
я использовал Mapstruct, он 9X_core-java преобразует мою сущность Bike
в BikeDto
и обратно:
@Mapper(componentModel = "spring")
@Component
public interface DtoMapper {
@Mapping(target = "type", constant = "bike")
BikeDto toBikeDto(Bike entity);
Bike toBikeEntity(BikeDto dto);
}
И 9X_java-api наконец, тестовый класс для этого примера. Он 9X_spring-config передает BikeDto
как тело сообщения POST и ожидает 9X_jre его возврата.
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("scratch")
public class SampleDataJpaApplicationTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setUp() {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void testDto() throws Exception {
BikeDto bikeDto = new BikeDto();
bikeDto.setId(42L);
bikeDto.setType("bike");
bikeDto.setModelYear(2019);
bikeDto.setFrameType("carbon");
Gson gson = new Gson();
String json = gson.toJson(bikeDto);
this.mvc.perform(post("/testDto").contentType(MediaType.APPLICATION_JSON).content(json))
.andExpect(status().isOk())
.andExpect(content().json(json));
}
}
POST (BikeDto
) тело:
{
"id":42,
"type":"bike",
"modelYear":2019,
"frameType":"carbon"
}
Другие классы 9X_java-api (сущности, сервисы, репозитории) вы можете 9X_javax посмотреть в полном примере on github.
- BikeDto - это экземпляр VehicleDto. Также, если не следует использовать только VehicleDto - можно сделать его а ...
-
6
-
2
-
17
-
5
-
6
-
56
-
2
-
8
-
10
-
21
-
18
-
1
-
4
-
8
-
5
-
2
-
2
-
5
-
10
-
2
-
4
-
9
-
8
-
2
-
9
-
8
-
3
-
2
-
2
-
12
-
5
-
2
-
5
-
4
-
5
-
14
-
1
-
2
-
4
-
7
-
1
-
6
-
2
-
5
-
7
-
5
-
6
-
1
-
3
-
10