为什么不像实体那样对DTO使用继承而不是关联?然后使用一些映射器将这些DTO映射到实体并返回(我更喜欢mapstruct)。
我在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;}@Datapublic class BikeDto extends VehicleDto { private String frameType;}@Datapublic class CarDto extends VehicleDto { private Boolean isCabriolet;}
需要@JsonTypeInfo和@JsonSubTypes来自动解析中的DTO类型
Controller。我的样本控制器接收到
VehicleDto并尝试将其作为
Bike实体与
DtoMapper和存储在数据库中
VehicleService。最后一步-
它再次从数据库中读取它并以响应
BikeDto。
@Controllerpublic 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,它可以将我的
Bike实体来回转换
BikeDto:
@Mapper(componentModel = "spring")@Componentpublic interface DtoMapper { @Mapping(target = "type", constant = "bike") BikeDto toBikeDto(Bike entity); Bike toBikeEntity(BikeDto dto);}
最后,为该示例测试类。它
BikeDto作为POST正文传递,并期望它返回。
@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"}
您可以在github上查看完整示例中的其他类(实体,服务,存储库)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)