1. 数据翻译
springboot 项目开发中常见到的数据翻译包括:
枚举翻译、字典表翻译、外键翻译、级联字段翻译、远程调用翻译等。
2. 数据来源
- 枚举代码(枚举)
- 数据表(字典表、关联表)
- 自定义方法(本地处理,跨服务查询、第三方API查询等)
这里通过定义3个注解来分别处理
核心注解 | 应用场景 |
@TransEnum | 读取枚举代码进行翻译 @TransEnum(dictType = "类型code", orgFieldName = "变量名") |
@TransSQL | 查询字典表、关联表获取数据 @TransSQL(selectSql = "select xx from xx where id=#{变量名}") |
@TransMethod | 用户自定义业务逻辑 @TransMethod(catalog="类型code", service =XxxTransService.class) |
3. 使用介绍
@TransEnum
说明:允许用户自定义枚举字典,要求枚举实现接口IDict,并添加 @DictType标识
@Getter
@Setter
public class ProjectDTO implements Serializable {/* 应用状态:字典值 */private String status;/* 应用状态:字典名称 */@TransEnum(dictType = "project_status", orgFieldName = "status")private String statusDesc;
}//定义一个枚举
@DictType(value = "project_status", label = "应用状态")
public enum ProjectStatusEnum implements IDict {no("未开始"), go("开发中"), check("验收中"), over("完成");private String label;ProjectStatusEnum(String label){this.label = label;}@Overridepublic String getLabel() {return label;}@Overridepublic Object getValue() {return name();}
}
@TransSQL
说明:@TransSQL 参数selectSql可以使用动态变量 #{userName}, ${userId}
@Getter
@Setter
public class ProjectDTO implements Serializable {/* 用户ID */private String userId;/* 用户名,从表sys_user中查询用户名后回填*/@TransSQL(selectSql = "select user_name from sys_user where id=#{userId}")private String userName;/* 应用状态值:字典值 project_status */private String status;/* 应用状态名:从表sys_dict_data中查询数据回填 */@TransSQL(selectSql = "select dict_label from sys_dict_data where dict_type='project_status' and dict_value=#{status}")private String statusDesc;
}
@TransMethod
说明:@TransMethod用于需要经过复杂计算得到的数据回填,需要用户自定义实现接口 ITransMethodService
@Getter
@Setter
public class ProjectDTO implements Serializable {//获取当前租户ID@TransMethod(catalog="", service = TenantTransService.class)private String tenantId;
}@Component
public class TenantTransService implements ITransMethodService {@Autowiredprivate BaseSessionService sessionService;@Overridepublic void handField(String catalog, Object object, Field field, Map<String, Object> example) {String fieldName = field.getName();if("tenantId".equals(fieldName)){String tenantId = sessionService.getTenantId();BeanMap.create(object).put(fieldName, tenantId);}}
}
手动调用
@RestController
@RequestMapping("/project")
@Slf4j
public class ProjectController {@Autowiredprivate ProjectService projectService;@Autowiredprivate EasyTransService transService;/*** Get localhost:9501/project/listByGroup/{groupId}* @param groupId* @return*/@ApiOperation(value = "查询应用列表(分组下)")@GetMapping("/listByGroup/{groupId}")public Result listByGroup(@PathVariable String groupId) {List<ProjectDTO> list = this.projectService.listByGroup(groupId);//翻译属性transService.transBatch(list);return Result.ok(list);}
}
4. 引入jar
核心依赖包:compile 'cn.hutool:hutool-all:5.8.10'compile 'com.geline.cloud:coder-sdk-easy-trans:1.2.9'
代码地址:数据翻译 · 语雀