将多个子dto设计为单个请求的Spring靴

将多个子dto设计为单个请求的Spring靴,第1张

将多个子dto设计为单个请求的Spring靴

为什么不像实体那样对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上查看完整示例中的其他类(实体,服务,存储库)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5153178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存