jdkman

导航

 

系统使用单独的表存储字典数据,业务表存入的字典表的编码,展示的时候需要以名称显示。
第一种是直接关联业务表和字典表。第二种是把字典做成工具类,使用这个工具类去转换查出的业务数据。这里介绍第二种,主要使用注解+反射。

字典表(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": "停用"
}]
posted on 2018-12-01 14:49  jdkman  阅读(363)  评论(0)    收藏  举报