java注解转化字典字段

发布时间:2024年01月18日

字典表结果如下:

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? , 大功告成!

文章来源:https://blog.csdn.net/kang5789/article/details/135676451
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。