目录
场景:
我根据数据库利用了MybatisPlus生成了代码模板,在完成前端发来的get请求时,发现前端想要接收的Json对象中的某些属性,实体类中没有,这时候就要额外创建DTO类,DTO也就是 Data Transfer Object,可以继承自生成的实体类,然后再DTO类中加入想添加的成员。
1.DTO类的使用案例
前端想要的响应数据如下:
实体类Dish中的属性如下:
我们不难发现,前端想要的CategoryName,我们单靠这个 Dish类不足以提供,最后会导致页面数据显示不完全(因为前端没有接收到完整的数据)
这时候我们就需要一个Dto类来做中间的传输介质 DishDto
并且由于我是用的是Mp(MybatisPlus)完成sql语句的增删改查,且DishDto类不在数据库表中,所以我们如果想单靠mp提供的方法,想完成DishDto的响应,就需要做一些处理,比如这里就用到了Beanutils.copyProperties()方法,实现对象的复制
这里的场景是分页查询,也就是使用mp提供的 selectPage完成,最后将结果封装成一个Page<T>类,我们现在要做的就是将查询得到的Page<Dish>通过复制和一些处理,变为Page<DishDto>
处理过程如上图所示,总的来说用了两次复制,第一复制排除了Page类中的records属性,因为通过查看Page类内部的方法我们会很容易发现records是个带有泛型的集合(见下图),这里具体就是List<Dish> records,显然不能直接复制给Page<DishDto>中的 List<DishDto>类型的 records,就算复制了也得不到CategoryName这个属性
所以我们可以通过获取Page<Dish>的records单独拿出来处理,然后通过stream流转化为List<DishDto>类型并加上CategoryName这个属性,也就是下图所示的方法
2.Delete请求中的细节
我们在写get请求的接口的时候,通常在形参部位直接写(变量类型 变量值)就行,这是因为对于get请求,SpringMVC中,Spring会自动对变量加上@RequestParam注解,对于非GET请求(如DELETE请求),Spring可能不会自动进行参数绑定,而需要显式地使用@RequestParam
注解。
对比图如下:
Delete请求:
Get请求:
总结:
在实际开发中,我发现了总会遇到一些出乎意料的bug或者情况,我们需要做到的就是不断解决他们,并从中吸取经验,学习并掌握之前未接触过的知识或者技术。在未来开发中,如果遇到类似的甚至其他的意外状况,都能够沉着冷静应对,从经验中找到解决方案。