系统使用单独的表存储字典数据,业务表存入的字典表的编码,展示的时候需要以名称显示。
第一种是直接关联业务表和字典表。第二种是把字典做成工具类,使用这个工具类去转换查出的业务数据。这里介绍第二种,主要使用注解+反射。
字典表(sys_dict)结构:
| id | category_code | value | name |
|---|---|---|---|
| 1 | SYZT | a | 启用 |
| 2 | SYZT | b | 停用 |
自定义注解Dict:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {
//字典类别
String categoryCode();
//存放名称的字段
String target();
}
在实体上使用注解:
public class User {
@Dict(categoryCode = "SYZT",target = "statusName")
private String status;
private String statusName;
}
字典工具类:
@Component
public class DictUtils {
@Autowired
private SysDictService sysDictService;
private Logger logger = LoggerFactory.getLogger(DictUtils.class);
/**
* 字典编码转名称.
*
* @param list the list
*/
public <T> void batchTransform(List<T> list) {
for (T o : list) {
transform(o);
}
}
/**
* 字典编码转名称.
*
* @param o the o
*/
public <T> void transform(T o) {
Class<?> clazz = o.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.isAnnotationPresent(Dict.class)) {
Dict dict = field.getAnnotation(Dict.class);
String categoryCode = dict.categoryCode();
String target = dict.target();
Collection<SysDict> dicts= sysDictService.listSysDictByCategoryCode(categoryCode);
try {
field.setAccessible(true);
String value = (String) field.get(o);
if (StringUtils.isEmpty(value)) {
return;
}
Field targetField = clazz.getDeclaredField(target);
for (SysDict sysDict : dicts) {
if (sysDict.getCode().equals(value)) {
targetField.setAccessible(true);
targetField.set(o, sysDict.getName());
break;
}
}
logger.error("字典编码转换失败,object:{},fieldName:{}", o, field.getName());
targetField.setAccessible(true);
targetField.set(o, value);
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
logger.error("字典编码转换失败,object:{},fieldName:{}", o, field.getName());
throw new AppException("字典编码转换失败", RequestCode.Operate_Tip);
}
}
}
}
}
工具类使用:
@Autowired
private DictUtils dictUtils;
@RequestMapping(value = "/pagedList", method = {RequestMethod.GET, RequestMethod.POST})
public ApiResult<PageInfo<User>> pagedList( UserQuery userQuery) {
List<User> list = userService.list(userQuery);
dictUtils.batchTransform(list);
return success(new PageInfo<>(list));
}
转换结果:
"list": [
{
"id": "01",
"status": "a",
"statusName": "启用"
},{
"id": "02",
"status": "b",
"statusName": "停用"
}]
浙公网安备 33010602011771号