前言
这边用若依的前后端分离版扩展进行开发,前几天加上了参数校验,然后 vo 层 和 do 的转换这块一直用的BeanUtils,然后若依原生是不集成 lombok 和 mapstruct的,一旦涉及到添加属性啥的就会十分不方便
依赖引入
<!-- 这里是写在上面的 变量声明里的 -->
<lombok.version>1.18.20</lombok.version>
<mapstruct.version>1.4.1.Final</mapstruct.version>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
简单理解下哈,上面是版本描述
使用案例
![image-20220826142621289](https://i-blog.csdnimg.cn/blog_migrate/f4e8287e61a2b5d516e96258b4856ee3.png)
这是我这边的 包划分,我习惯把 vo 对象放在接口包下,然后 convert 包单独放在一个包
我这边现在主要替换的是 vo 到 do 的转换,之前用的 BeanUtils,然后也顺便替换下之前手动 getter setter,原有实现我这边就不动了,只改了我这边自己添加的模块
这是 vo
@ApiModel("管理后台 - 客户资料 Request VO")
@Data
public class CompanyAddVo {
@ApiModelProperty(value = "公司名称", required = true, example = "我是一个公司名")
@NotBlank(message = "公司名称不可为空")
private String name;
@ApiModelProperty(value = "公司地址", required = true, example = "湖北省武汉市")
@NotBlank(message = "公司地址不可为空")
private String address;
@ApiModelProperty(value = "备注", example = "我是一个备注")
private String note;
@ApiModelProperty(value = "唯一识别码", required = true, example = "我是一个识别码")
@NotBlank(message = "唯一识别码不可为空")
private String uniqueNumber;
}
do
@Data
@EqualsAndHashCode(callSuper = true)
public class XlCompany extends BaseEntity {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String code;
private String address;
private String email;
private String note;
private String uniqueNumber;
}
convert 也是我们能够实现映射的关键
@Mapper
public interface CompanyConvert {
CompanyConvert INSTANCE = Mappers.getMapper(CompanyConvert.class);
XlCompany convert(CompanyAddVo bean);
}
先看下之前的实现
/**
* 新增公司
*/
@ApiOperation("新增公司")
@RepeatSubmit
@PreAuthorize("@ss.hasPermi('xl:company:add')")
@Log(title = "公司", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Valid @RequestBody CompanyAddVo companyAddVo)
{
XlCompany xlCompany = new XlCompany();
BeanUtils.copyProperties(companyAddVo, xlCompany);
xlCompany.setCreateTime(new Date());
return toAjax(xlCompanyService.insertXlCompany(xlCompany));
}
之前的 do 和 vo 的 setter getter toString 等的重写我这边就不列举了
改为使用 mapstruct
XlCompany xlCompany = CompanyConvert.INSTANCE.convert(companyAddVo);
展望
这次升级也是主要去掉繁杂的 getter setter 方法,然后引入 mapstruct,做的扩展不够多,等到后面体系划分的更为完善,续更后面的修改,目前主要的参考是 ruoyi-vue-pro 这个项目,会尝试把这个项目里面比较好的规范引入到原始版本的若依里面,其实也是因为现在比较菜,直接替换成这个会有点压力,但是初始版本的若依很多地方用的不太方便,就出了这样一个方案,逐步引入一些能解决痛点问题的东西进来