springboot 项目开发中常见到的数据翻译包括:
枚举翻译、字典表翻译、外键翻译、级联字段翻译、远程调用翻译等。
这里通过定义3个注解来分别处理
| 核心注解 | 应用场景 |
| @TransEnum | @TransEnum(dictType = "类型code", source = "变量名") 说明:使用枚举翻译 |
| @TransDict | @TransDict(dictType = "类型code", source = "源变量名") 说明:优先使用枚举翻译,再使用字典表翻译; 需要自定义实现接口 TransDictHandler,用于读取字典表翻译 |
| @TransSQL | @TransSQL(selectSql = "select xx from xx where id=#{变量名}") 说明:配置动态SQL,查询字典表、关联表进行翻译,支持Entity对象 |
| @TransClass | @TransClass(catalog="类型code", service =XxxTransService.class) 说明:用户自定义翻译代码,如访问http接口进行翻译 |
@TransEnum
说明:允许用户自定义枚举字典,要求枚举实现接口IDict,并添加 @DictType标识
- @Getter
- @Setter
- public class ProjectDTO implements Serializable {
-
- /* 应用状态:字典值 */
- private String status;
-
- /* 应用状态:字典名称 */
- @TransEnum(dictType = "project_status", orgFieldName = "status")
- private String statusDesc;
-
- /* 业务类型 sys_oper_type */
- private String operType;
-
- @TransDict(dictType = "sys_oper_type", source = "operType")
- private String operTypeDesc;
- }
-
-
- //定义一个枚举
- @DictType(value = "project_status", label = "应用状态")
- public enum ProjectStatusEnum implements IDict {
- no("未开始"),
- go("开发中"),
- check("验收中"),
- over("完成");
-
- private String label;
-
- ProjectStatusEnum(String label){
- this.label = label;
- }
-
- @Override
- public String getLabel() {
- return label;
- }
-
- @Override
- public 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;
- }
@TransClass
说明:@TransClass用于需要经过复杂计算得到的数据回填,需要用户自定义实现接口 ITransService
- @Getter
- @Setter
- public class ProjectDTO implements Serializable {
-
- //获取当前租户ID
- @TransClass(catalog="", service = TenantTransService.class)
- private String tenantId;
- }
-
-
- @Component
- public class TenantTransService implements TransClassService {
-
- @Autowired
- private BaseSessionService sessionService;
-
- @Override
- public void handField(String catalog, Object object, Field field, Map
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 {
-
- @Autowired
- private ProjectService projectService;
- @Autowired
- private EasyTransService transService;
-
- /**
- * Get localhost:9501/project/listByGroup/{groupId}
- * @param groupId
- * @return
- */
- @ApiOperation(value = "查询应用列表(分组下)")
- @GetMapping("/listByGroup/{groupId}")
- public Result listByGroup(@PathVariable String groupId) {
- List
list = this.projectService.listByGroup(groupId); - //翻译属性
- transService.transBatch(list);
- return Result.ok(list);
- }
- }
4. 引入jar
maven 依赖方式:将 jar 放在/libs目录下,配置如下com.geline.cloud coder-sdk-easy-trans system 1.3.0 ${project.basedir}/libs/coder-sdk-easy-trans-1.3.0.jar
gradle 依赖方式:将 jar 放在/libs目录下,配置如下
compile fileTree(dir: 'libs', includes: ['*jar'])
源代码地址:https://gitee.com/cloud-coder/coder-sdk-easy-trans