代码完善(master): 数据库翻译支持字段不一致情况(映射模式解决)
This commit is contained in:
parent
edb337d188
commit
0e8bc80015
12
README.md
12
README.md
@ -148,7 +148,7 @@ dict-trans
|
||||
<dependency>
|
||||
<groupId>com.aizuda</groupId>
|
||||
<artifactId>dict-trans</artifactId>
|
||||
<version>0.7</version>
|
||||
<version>0.8</version>
|
||||
</dependency>
|
||||
|
||||
<!-- hutool工具类(必须) -->
|
||||
@ -269,6 +269,9 @@ public class People {
|
||||
参数:
|
||||
* dictClass:字典配置类,指定的 class 上必须是 `DictTranslate.class` 实现类 、 `IEnum` 接口的实现类 、 `Desensitized` 、 `SummaryExtract` 或者是 `@Dictionary` 注解;
|
||||
* translateField:翻译后的属性名,注意使用驼峰命名,默认为原属性名去除末尾的 "Id" 和 "Code" 再接上 "Name";
|
||||
1. 不填时默认为原属性名去除末尾的"Id"和"Code"再接上"Name"
|
||||
2. Desensitized(脱敏) 与 SummaryExtract(摘要提取)不填时默认为原字段
|
||||
3. 数据库翻译时,若查询的字段与翻译字段长度不一致,可以填写字段映射。格式:“查询字段:翻译字段”,如“sex:sexName”。此时将会自动重新组织数据,防止翻译对不上的情况。*注意:若不使用映射模式,一定要长度一致,顺序一致!!!否者会出现对应错乱!!!*
|
||||
* groupValue:组属性值,在静态字典表这种拥有组属性的字典中需要手动传入一个定值(即:字典分组的 code);
|
||||
* dictionary:指定 `Dictionary` 并设置其属性,将覆盖 `dictClass` 上的 `Dictionary` 注解的配置,指定了该属性后也可不指定 `dictClass` ,一般情况下不会使用;
|
||||
* conditionField:指定判断条件字段(仅自定义翻译实现时用来进行判断)『20230822更新后支持固定值,格式:V:<值>』;
|
||||
@ -310,7 +313,14 @@ public class UserDB {
|
||||
}
|
||||
|
||||
// 2.2. 字段翻译
|
||||
// 特殊用法1(多列翻译):
|
||||
// @Translate(dictClass = UserDB.class, translateField = {"name", "sex"})
|
||||
//
|
||||
// 特殊用法2(映射翻译):
|
||||
// 针对此种翻译注解情况 @Dictionary(codeColumn = "id", textColumn = {"user_name", "sex"})
|
||||
// @Translate(dictClass = UserDB.class, translateField = {"user_name:name"})
|
||||
//
|
||||
// 常规用法如下:
|
||||
@Translate(dictClass = UserDB.class, translateField = "name")
|
||||
private String id;
|
||||
|
||||
|
@ -38,6 +38,7 @@ public @interface Translate {
|
||||
* <ul>
|
||||
* <li>1. 不填时默认为原属性名去除末尾的"Id"和"Code"再接上"Name"</li>
|
||||
* <li>2. Desensitized(脱敏) 与 SummaryExtract(摘要提取)不填时默认为原字段</li>
|
||||
* <li>3. 数据库翻译时,若查询的字段与翻译字段长度不一致,可以填写字段映射。格式:“查询字段:翻译字段”,如“sex:sexName”。此时将会自动重新组织数据,防止翻译对不上的情况。<p>注意:若不使用映射模式,一定要长度一致,顺序一致!!!否者会出现对应错乱!!!</p></li>
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
|
@ -1,6 +1,12 @@
|
||||
package com.aizuda.trans.demo;
|
||||
|
||||
import com.aizuda.trans.entity.*;
|
||||
import com.aizuda.trans.entity.Device;
|
||||
import com.aizuda.trans.entity.People;
|
||||
import com.aizuda.trans.entity.People2;
|
||||
import com.aizuda.trans.entity.People2_1;
|
||||
import com.aizuda.trans.entity.People3;
|
||||
import com.aizuda.trans.entity.People4;
|
||||
import com.aizuda.trans.entity.Result;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -44,6 +50,14 @@ public interface DemoService {
|
||||
*/
|
||||
public List<People2> dbDemo();
|
||||
|
||||
/**
|
||||
* 数据库演示(单列翻译)
|
||||
*
|
||||
* @return {@link List }<{@link People2 }>
|
||||
* @author nn200433
|
||||
*/
|
||||
public List<People2_1> dbDemo1();
|
||||
|
||||
/**
|
||||
* json演示
|
||||
*
|
||||
|
@ -6,6 +6,7 @@ import com.aizuda.trans.demo.DemoService;
|
||||
import com.aizuda.trans.entity.Device;
|
||||
import com.aizuda.trans.entity.People;
|
||||
import com.aizuda.trans.entity.People2;
|
||||
import com.aizuda.trans.entity.People2_1;
|
||||
import com.aizuda.trans.entity.People3;
|
||||
import com.aizuda.trans.entity.People4;
|
||||
import com.aizuda.trans.entity.Result;
|
||||
@ -55,6 +56,15 @@ public class DemoServiceImpl implements DemoService {
|
||||
return CollUtil.newArrayList(man, woman, more);
|
||||
}
|
||||
|
||||
@Translator
|
||||
@Override
|
||||
public List<People2_1> dbDemo1() {
|
||||
People2_1 man = People2_1.builder().id("1").build();
|
||||
People2_1 woman = People2_1.builder().id("2").build();
|
||||
People2_1 more = People2_1.builder().id("1,2").build();
|
||||
return CollUtil.newArrayList(man, woman, more);
|
||||
}
|
||||
|
||||
@Translator
|
||||
@Override
|
||||
public List<People3> jsonDemo() {
|
||||
|
@ -0,0 +1,27 @@
|
||||
package com.aizuda.trans.entity;
|
||||
|
||||
import com.aizuda.trans.annotation.Translate;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 人2_1
|
||||
*
|
||||
* @author nn200433
|
||||
* @date 2022-12-16 016 11:40:30
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class People2_1 {
|
||||
|
||||
/** 数据库翻译 */
|
||||
@Translate(dictClass = UserDB.class, translateField = {"user_name:name"})
|
||||
private String id;
|
||||
|
||||
private String name;
|
||||
|
||||
}
|
@ -7,6 +7,7 @@ import com.aizuda.trans.demo.DemoService;
|
||||
import com.aizuda.trans.entity.Device;
|
||||
import com.aizuda.trans.entity.People;
|
||||
import com.aizuda.trans.entity.People2;
|
||||
import com.aizuda.trans.entity.People2_1;
|
||||
import com.aizuda.trans.entity.People3;
|
||||
import com.aizuda.trans.entity.People4;
|
||||
import com.aizuda.trans.entity.Result;
|
||||
@ -50,6 +51,12 @@ public class TranslatorTest {
|
||||
Console.log("---> 数据库 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void demo3_1() {
|
||||
List<People2_1> peopleList = demoService.dbDemo1();
|
||||
Console.log("---> 数据库(长度不一致,采用字段映射方式) 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void demo4() {
|
||||
List<People3> peopleList = demoService.jsonDemo();
|
||||
|
@ -43,6 +43,7 @@ import org.springframework.stereotype.Service;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@ -171,41 +172,68 @@ public class TranslatorHandle {
|
||||
* @author nn200433
|
||||
*/
|
||||
private static <T> void transformField(T origin, FormatType fieldFormatType, Field field) {
|
||||
// 1.获取要翻译的属性名
|
||||
// 1.获取要翻译的属性名 及 获取每个待翻译属性的配置
|
||||
final String fName = field.getName();
|
||||
final String fieldName = NameUtil.parseCamelTo(fName, fieldFormatType);
|
||||
// 2.获取每个待翻译属性的配置
|
||||
final Translate translateConfig = field.getAnnotation(Translate.class);
|
||||
final Class<?> dictClass = getDictClass(translateConfig);
|
||||
final List<String> writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType);
|
||||
final String groupValue = translateConfig.groupValue();
|
||||
final String conditionField = translateConfig.conditionField();
|
||||
final String desensitizedModel = translateConfig.desensitizedModel();
|
||||
final int maxLen = translateConfig.maxLen();
|
||||
final Dictionary dictionaryConfig = handle(dictClass, translateConfig);
|
||||
final boolean isJsonConvert = IJsonConvert.class.isAssignableFrom(dictClass);
|
||||
final boolean isSetFieldEmpty = translateConfig.setFieldEmpty();
|
||||
|
||||
// 获取未翻译的原值,如果值为空则跳过
|
||||
final Dictionary dictionaryConfig = handle(dictClass, translateConfig);
|
||||
final String[] columns = dictionaryConfig.textColumn();
|
||||
final String codeColumn = dictionaryConfig.codeColumn();
|
||||
List<String> writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType);
|
||||
// 2. 获取未翻译的原值,如果值为空则跳过
|
||||
String originValue = Convert.toStr(getProperty(origin, fieldName));
|
||||
if (originValue == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取条件字段值
|
||||
// 3. 获取条件字段值
|
||||
String conditionFieldValue = Opt.ofBlankAble(conditionField)
|
||||
.map(c -> StrUtil.startWith(c, CONDITION_FIELD_IS_VALUE_PREFIX) ? StrUtil.removePrefix(c, CONDITION_FIELD_IS_VALUE_PREFIX) : Convert.toStr(getProperty(origin, c)))
|
||||
.get();
|
||||
|
||||
// 获取翻译结果并脱敏处理
|
||||
// 4. 获取翻译结果
|
||||
final ExtendParam extendParam = new ExtendParam(groupValue, conditionFieldValue, dictClass, maxLen);
|
||||
List<Object> translateValList = parse(originValue, dictionaryConfig, extendParam);
|
||||
// 5. 数据库翻译时,处理多个值情况的问题
|
||||
if (StrUtil.isNotBlank(codeColumn) && ArrayUtil.isNotEmpty(columns)) {
|
||||
final int columnLen = columns.length;
|
||||
final int writeFieldSize = writeFieldList.size();
|
||||
List<String> newWriteFieldList = new ArrayList<String>(writeFieldSize);
|
||||
List<Object> newTranslateValList = new ArrayList<Object>(translateValList.size());
|
||||
if (columnLen > 1) {
|
||||
for (final String writeField : writeFieldList) {
|
||||
final List<String> fieldList = StrUtil.split(writeField, StrUtil.COLON, Boolean.TRUE, Boolean.TRUE);
|
||||
// Assert.isTrue(fieldList.size() == 2, "数据库翻译异常:由于查询字段多于翻译字段,需要设置映射关系(格式:“查询字段:翻译字段”,如“sex:sexName”),您未进行设置或设置错误。");
|
||||
if (fieldList.size() != 2) {
|
||||
continue;
|
||||
}
|
||||
// 左侧为数据库查询字段,右侧为翻译字段,根据查询字段获取结果值的下标
|
||||
final String queryColumn = fieldList.get(0);
|
||||
final String waitWriteField = fieldList.get(1);
|
||||
final int translateValDataIndex = ArrayUtil.indexOf(columns, queryColumn);
|
||||
// 构造新数据
|
||||
newWriteFieldList.add(waitWriteField);
|
||||
newTranslateValList.add(translateValList.get(translateValDataIndex));
|
||||
}
|
||||
if (CollUtil.isNotEmpty(newWriteFieldList)) {
|
||||
writeFieldList = newWriteFieldList;
|
||||
}
|
||||
if (CollUtil.isNotEmpty(newTranslateValList)) {
|
||||
translateValList = newTranslateValList;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 6. 脱敏处理
|
||||
if (!isJsonConvert) {
|
||||
// 不是 JsonConvert.class 时可进行脱敏
|
||||
translateValList = desensitizedHandle(desensitizedModel, translateValList);
|
||||
}
|
||||
|
||||
// 将翻译结果填入翻译展示字段
|
||||
// 7. 将翻译结果填入翻译展示字段
|
||||
setProperty(origin, (isJsonConvert && isSetFieldEmpty), fieldName, writeFieldList, translateValList);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user