字典表结果如下:
CREATE TABLE `sys_dict` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`dict_code` varchar(128) NOT NULL COMMENT '字典编码',
`dict_name` varchar(128) NOT NULL COMMENT '字典名称',
`dict_value` int(3) NOT NULL COMMENT '字典值',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8mb4 COMMENT='字典表';
INSERT INTO `sys_dict` VALUES (NULL, 'contract_type', '预研合同', '1');
INSERT INTO `sys_dict` VALUES (NULL, 'contract_type', '研制合同', '2');
INSERT INTO `sys_dict` VALUES (NULL, 'contract_type', '订购合同', '3');
1、创建java注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description: 自定义注解,实现字典name 、value的转换
* @Author: kang
* @Date: 2024/1/18
*/
@Target(ElementType.FIELD) // 这个注解应用于字段
@Retention(RetentionPolicy.RUNTIME) // 这个注解在运行时仍然可用
public @interface DictField {
String value() default ""; // 默认值为空字符串
}
2、在需要解析的实体上加注解,注意这些@DictField里面的值就是对应字典表的code
public class ContractInfo {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String code;
/**
* 合同类型
*/
@DictField("contract_type")
private String type;
/**
* 产品层级
*/
@DictField("product_level")
private String productLevel;
/**
* 合同类别
*/
@DictField("contract_category")
private String category;
}
3、定义工具类,将这些注解的值转化为字典的name用于前端展示
import cn.hutool.core.collection.CollUtil;
import com.mars.admin.aspect.DictField;
import com.mars.admin.entity.SysDict;
import com.mars.admin.service.SysDictService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.List;
/**
* @Description: 自定义注解,实现字典name 、value的转换
* @Author: zhangdongkang
* @Date: 2024/1/18
*/
@Slf4j
@Service
public class DictUtil {
@Resource
private SysDictService sysDictService;
/**
* @Description: 设置字典name 、value的转换
* @Author: zhangdongkang
* @Date: 2024/1/18
*/
public <Q> void parse(List<Q> list) {
if (CollUtil.isEmpty(list)) {
return;
}
List<SysDict> dictList = sysDictService.getAll();
if (CollUtil.isEmpty(dictList)) {
return;
}
try {
for (Q obj : list) {
for (Field field : obj.getClass().getDeclaredFields()) {
DictField dictField = field.getAnnotation(DictField.class);
if (dictField != null) {
field.setAccessible(true);
String dictCode = dictField.value();
String dictValue = (String) field.get(obj);
SysDict sysDict = dictList.stream().filter(i -> dictCode.equals(i.getDictCode()) && dictValue.equals(i.getDictValue())).findFirst().orElse(null);
if (sysDict != null) {
field.set(obj, sysDict.getDictName());
}
}
}
}
} catch (Exception e) {
log.info("##### 字典注解映射出错了:{}", e.getMessage());
}
}
}
4、也可以在controller手动调用,也可以定义切面,我比较懒直接手动调用
@GetMapping("contractinfo/list")
public void export(ContractInfo contractinfo) throws Exception {
List<ContractInfo> list = contractinfoService.list(Wrappers.query(contractinfo));
//手动调用
dictUtil.parse(list);
}
ok? , 大功告成!