SpringBoot项目基础设施搭建( 四 )

<>(ExceptionEnum.FORBIDDEN.getResultCode(),ExceptionEnum.FORBIDDEN.getResultMsg(), data, false);@Overridepublic String toString() {return toJSONString(this);复制代码对象类型转换
在项目中 , 尤其是在服务层 , 经常要将服务中的 Dto 实体对象转换为 Entity 对象 , 以及将 Entity 对象转换为 VO 对象返回给前端展示 。现在市面上有很多这样的工具包 , 比如 Spring 框架中就自带了 BeanUtils , 使我们进行这样的数据操作十分简单快捷 , 但当数据量级特别大时 , 存在性能问题 。因此我们要选择一款优秀的工具——Mapstruct 。
关于 Mapstruct 的介绍以及其他对象转换工具 , 可以参考这两篇文章:Apache的BeanUtils、Spring的BeanUtils、Mapstruct、BeanCopier对象拷贝 和 MapStruct 才是王者
定义如下对象类型转换文件:
@Mapper(componentModel = "spring")public interface UserStruct {@Mapping(target = "jobVOS",source = "jobs")UserVO modelToVO(User record);@Mapping(target = "jobVOS",source = "jobs")List modelToVO(List records);User voToModel(UserVO record);List voToModel(List records);UserDTO modelToDTO(User record);List modelToDTO(List records);User dtoToModel(UserDTO record);List dtoToModel(List records);复制代码
如果对象中的属性名不同 , 可以使用 @Mapping 注解进行声明 , 自动生成的 UserStructImpl.class 如下所示 , 这里只展示部分代码 。
@Componentpublic class UserStructImpl implements UserStruct {@Overridepublic UserVO modelToVO(User record) {if ( record == null ) {return null;UserVO userVO = new UserVO();userVO.setJobVOS( jobListToJobVOList( record.getJobs() ) );userVO.setName( record.getName() );userVO.setAge( record.getAge() );userVO.setAddress( record.getAddress() );return userVO;protected JobVO jobToJobVO(Job job) {if ( job == null ) {return null;JobVO jobVO = new JobVO();jobVO.setName( job.getName() );jobVO.setAddress( job.getAddress() );return jobVO;protected List jobListToJobVOList(List list) {if ( list == null ) {return null;List list1 = new ArrayList( list.size() );for ( Job job : list ) {list1.add( jobToJobVO( job ) );return list1;复制代码分组校验和自定义校验
@Validation是一套帮助我们继续对传输的参数进行数据校验的注解 , 通过配置 Validation 可以很轻松的完成对数据的约束 。
@Validated作用在类、方法和参数上
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Validated {Class[] value() default {};复制代码
在项目中我们可能会遇到这样的场景:新增数据时某些字段需要进行判空校验 , 而修改数据时又需要校验另外一些字段 , 而且都是用同一个对象来封装这些字段 , 为了便于管理及代码的优雅 , 我们决定引入分组校验 。
创建分组 , 区分新增和编辑以及其它情况下的参数校验 。
public interface ValidateGroup {* 新增interface Add extends Default {* 删除interface Delete {interface Edit extends Default {复制代码
除了分组校验 , validation 还允许我们自定义校验器 。
@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.PARAMETER})@Constraint(validatedBy = EnumValidatorClass.class)public @interface EnumValidator {String[] value() default {};boolean required() default true;// 校验枚举值不存在时的报错信息String message() default "enum is not found";//将validator进行分类 , 不同的类group中会执行不同的validator操作Class[] groups() default {};//主要是针对bean , 很少使用Class[] payload() default {};复制代码
其中 EnumValidatorClass 类主要是为了校验 EnumValidator 注解的 , 代码如下:
public class EnumValidatorClass implements ConstraintValidator {private String[] values;@Overridepublic void initialize(EnumValidator enumValidator) {this.values = enumValidator.value();@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {boolean isValid = false;if (value =https://www.isolves.com/it/cxkf/kj/2022-11-18/= null) {//当状态为空时使用默认值return true;for (int i = 0; i < values.length; i++) {if (values[i].equals(String.valueOf(value))) {isValid = true;break;return isValid;复制代码
后续项目实践过程中会演示具体使用 。
Liquibase
Liquibase 是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具 。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中 , 便于版本控制 , 它的目标是提供一种数据库类型无关的解决方案 , 通过执行 schema 类型的文件来达到迁移 。


推荐阅读