背景:

       我们数据库为了减少存储容量和数据查询传输量以及增大查询效率,一般都会把字段进行编码而不是存中文,所以有时候字段值有可能是0 ==未处理,1 == 已处理。 但是,展示到前端需要将 值翻译成中文,如果人工来做会很麻烦,解放双手将此类工作交给程序来解决.

spring boot个人博客的数据字典 springboot字典配置_java

实现目标:

spring boot个人博客的数据字典 springboot字典配置_java_02

源码:自定义注解:DataDict,用于bo对象类,需要翻译的属性

package com.qboa.common.annotation.dict;

import java.lang.annotation.*;

/**
 * 说明:数据字典处理类
 * Created by luojie on 2019/05/29.
 */
//@DataDict(  dict="patType", source = "patType" )
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataDict {

    /**
     * 方法描述 描述标准编码 或是用户字段(对应UserBo)
     * 与user配合使用,需要取的信息字段
     * 如:要去age 则配置age 要取 userName 则配置 userName
     *
     * @return
     */
    String dict() default "";

    /**
     * 翻译类型 "0" 标准代码  "1"用户
     *
     * @return
     */
    String busi() default "0";

    /**
     * 方法描述,可使用占位符获取参数:{{source}}
     * 主要标准编码之来源,
     * 查询用户信息时存储用户userId 的字段名称
     */
    String source() default "";

    /**
     * 对source 值是否需要对行转列进行拆分处理{{","}}
     * 需要对source值按逗号进行拆分后翻译,默认拆分转换
     * 若是{{$}}则按$进行拆分
     * 默认不处理
     * 如:
     * "proMode": "1,2",
     * "proModeName": "出售,结算",
     *
     * @return
     */
    String transferLineColumn() default "";

    /**
     * 方法描述 描述标准编码组
     * 翻译该字段需要哪些标准码
     *
     * @return
     */
    String[] dictArr() default {};

    /**
     * 方法描述 区分字段,先决条件
     * 决定取哪个标准编码
     *
     * @return
     */
    String differ() default "";

    /**
     * 方法描述 区分字段,先决条件比较值
     * 决定取哪个标准编码比较值
     * 满足条件获取下标 从dictArr 中取下标的标准代码
     *
     * @return
     */
    String[] differValues() default {};


}

自定义注解: 

DataDictClass  用来标注返回对象集合需要翻译的方法,本功能目前只支持bean对象的属性翻译
package com.zddts.common.annotation.dict;

import java.lang.annotation.*;

/**
 * 说明:
 * Created by luojie on 2019/05/29.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataDictClass {

}

切面处理: DataDictAspect

package com.qboa.oa.aop;

import com.alibaba.fastjson.JSON;
import com.qboa.common.annotation.dict.DataDict;
import com.qboa.common.annotation.dict.DataDictClass;
import com.qboa.common.bo.admin.UserBo;
import com.qboa.common.bo.pubapp.puCode.PuCodeBo;
import com.qboa.common.contants.ReidsConstants;
import com.qboa.common.utils.BeanUtils;
import com.qboa.oa.client.PubAppClient;
import com.qboa.oa.util.UserUtil;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 说明:数据字典切面类
 * Created by luojie on 2019/05/29.
 */
@Aspect
@Component
public class DataDictAspect {

    @Autowired
    PubAppClient pubappClient;
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
    @Autowired
    private UserUtil userUtil;


    /**
     * 非基本类型在 CLASS 中的定义
     */
    private static final String FILED_NAME_TYPE = "TYPE";

    private Map<String, String> dictInfoMap = new ConcurrentHashMap<>();

    @Pointcut("@annotation(dataDictClass)")
    public void doDataDictClass(DataDictClass dataDictClass) {
    }

    @Around("@annotation(dataDictClass)")
    public Object translation(final ProceedingJoinPoint pjp, DataDictClass dataDictClass) throws Throwable {
        Object result = pjp.proceed();
        if (result == null) {
            return result;
        }
        Object obj;
        if (result instanceof List || result instanceof ArrayList) {

            List olist = ((List) result);
            if (olist.size() == 0) {
                return result;
            }
            obj = olist.get(0);
        } else if (result instanceof Page) {//支持Page类的数据字典转换
            List olist = ((Page) result).getContent();
            if (olist.size() == 0) {
                return result;
            }
            obj = olist.get(0);
        } else {
            obj = result;
        }
        /**
         * 获取翻译字段配置信息
         */
        Map<String, DataDict> dataDictMap = boDict(obj.getClass());
        if (dataDictMap.size() == 0) {
            return result;
        }

        /**
         * 获取字典信息
         */
        this.getPCodeInfo();
        /**
         * 开始翻译
         */
        if (result instanceof List || result instanceof ArrayList) {
            for (Object o : (List) result) {
                sign(o, dataDictMap, dictInfoMap);
            }
        } else if (result instanceof Page) {//支持Page类
            ((Page) result).forEach(o -> sign(o, dataDictMap, dictInfoMap));
        } else {
            sign(result, dataDictMap, dictInfoMap);
        }
        return result;
    }

    /**
     * 设置数据字典
     */
    public void getPCodeInfo() throws Exception {
        Object codeObj = redisTemplate.opsForValue().get(ReidsConstants.PUCODE_REDIS_ALL);
        List<PuCodeBo> dictInfos;
        //缓存中没有重新从数据库中取
        if (codeObj == null) {
            dictInfos = pubappClient.getAllPuCode();
            redisTemplate.opsForValue().set(ReidsConstants.PUCODE_REDIS_ALL, dictInfos);
        } else {
            dictInfos = (List<PuCodeBo>) codeObj;
        }
        if (dictInfos == null || dictInfos.size() == 0) {
            return;
        }
        //先把字典值转成map
        for (PuCodeBo puCodeBo : dictInfos) {
            dictInfoMap.put(puCodeBo.getCodeType() + puCodeBo.getCodeValue(), puCodeBo.getCodeName());
        }
    }

    /**
     * 获取bo中属性值
     *
     * @param cla
     * @return
     */
    private Map<String, DataDict> boDict(Class cla) {
        Field[] fields = cla.getDeclaredFields();
        Map<String, DataDict> map = new HashMap<String, DataDict>();
        for (Field field : fields) {
            if (field.isAnnotationPresent(DataDict.class)) {
                DataDict dataDict = field.getAnnotation(DataDict.class);
                String fieldName = field.getName();
                map.put(fieldName, dataDict);
            }
        }
        return map;
    }

    /**
     * 单个设置值
     *
     * @param obj
     * @param dataDictMap 注解字段
     * @param dictInfoMap
     */
    public void sign(Object obj, Map<String, DataDict> dataDictMap, Map<String, String> dictInfoMap) {

        for (Map.Entry<String, DataDict> entry : dataDictMap.entrySet()) {
            String fileName = entry.getKey();
            DataDict dataDict = entry.getValue();
            String busi = StringUtils.isBlank(dataDict.busi()) ? "0" : dataDict.busi();
            //翻译类型
            if ("0".equals(busi)) {
                this.setPCode(obj, dataDict, fileName, dictInfoMap);
            } else if ("1".equals(busi)) {//翻译用户字段
                this.setUserInfo(obj, dataDict, fileName);
            }

        }


    }

    /**
     * 设置标准代码--字典
     *
     * @param obj
     * @param dataDict    属性的注解字段配置
     * @param fileName    需要赋值的字段
     * @param dictInfoMap 字典信息数据
     * @throws Exception
     */
    public void setPCode(Object obj, DataDict dataDict, String fileName, Map<String, String> dictInfoMap) {
        if (dictInfoMap == null || dictInfoMap.size() == 0) {
            return;
        }
        String dict = dataDict.dict();
        if (StringUtils.isBlank(dict)) {
            String[] dictArr = dataDict.dictArr();//多个字典组 长度与differValues必须一致
            String differ = dataDict.differ();   // 字典  选择条件字段 作区分的字段
            String[] differValuesArr = dataDict.differValues();//differ 对应值的枚举值  匹配上选对应下标的dict字典来取值
            try {
                //作区分字段的值
                String differValue = (String) BeanUtils.getBeanFieldValue(obj.getClass(), obj, differ);
                if (StringUtils.isBlank(differValue)) {
                    //值无数据不比较
                    return;
                }
                for (int i = 0; i < differValuesArr.length; i++) {
                    if (differValue.equals(differValuesArr[i])) {
                        dict = dictArr[i];
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //未匹配上字典不设置
        if (StringUtils.isBlank(dict)) {
            return;
        }
        String source = dataDict.source();//需要翻译的字段
        String transferLineColumn = dataDict.transferLineColumn();//拆分符号 有则按照拆分符号拆分翻译
        try {
            //获取源编码值
            String sourceValue = (String) BeanUtils.getBeanFieldValue(obj.getClass(), obj, source);
            String dictCodeName = null; //字典值 翻译后的值
            //新增对例如1,2,3 多个值要标准码转换进行转换"proMode": "1,2",         "proModeName": "出售,结算",
            if (StringUtils.isNotBlank(transferLineColumn)) {
                if (StringUtils.isNotBlank(sourceValue) && sourceValue.indexOf(transferLineColumn) > 0) {
                    String[] s = sourceValue.split(transferLineColumn);
                    for (int i = 0; i < s.length; i++) {
                        String a = s[i];
                        if (i == 0) {
                            dictCodeName = dictInfoMap.get(dict + a);
                        } else {
                            dictCodeName = dictCodeName + transferLineColumn + dictInfoMap.get(dict + a);
                        }
                    }
                } else {
                    dictCodeName = dictInfoMap.get(dict + sourceValue);
                }
            } else {
                dictCodeName = dictInfoMap.get(dict + sourceValue);
            }
            //设置值
            BeanUtils.setBeanField(obj.getClass(), obj, fileName, dictCodeName);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 设置用户信息
     *
     * @param obj
     * @param dataDict 属性注解字段配置
     * @param fileName 需要赋值的字段
     * @throws Exception
     */
    public void setUserInfo(Object obj, DataDict dataDict, String fileName) {
        String source = dataDict.source(); //存储用户userId 的字段名称
        String dict = dataDict.dict();//获取用户目标信息的字段
        if (StringUtils.isBlank(dict)) {
            return;
        }
        try {
            Object userIdobj = BeanUtils.getBeanFieldValue(obj.getClass(), obj, source);
            if (userIdobj == null) {
                return;
            }
            String userIdstr = String.valueOf(userIdobj);
            if ("".equals(userIdstr)) {
                return;
            }
            Long userId = Long.valueOf(userIdstr);
            //查询用户信息 根据自己配置是数据库还是redis
            UserBo user = userUtil.getUserBoInRedis(userId);
            if (user == null) {
                return;
            }
            //todo 目前支持字符串类型 数值类型,不支持对象 类型 和时间类型 目标和源 的类型必须要一致
            Object fromValue = BeanUtils.getBeanFieldValue(user.getClass(), user, dict);
            //设置值
            BeanUtils.setBeanField(obj.getClass(), obj, fileName, fromValue);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }


    }

    /**
     * json处理 todo
     *
     * @param returnJsonResult
     * @param returnType
     * @return
     */
    private Object getJsonToResultObject(String returnJsonResult, Class returnType) {
        // 对象复原
        if (StringUtils.isNotBlank(returnJsonResult)) {
            // 基本类型则直接返回封装类型则对象转换
            if (returnType.isPrimitive()) {
                return returnJsonResult;
            } else {
                try {
                    if ((returnType.getField(FILED_NAME_TYPE)
                            .getClass()).isPrimitive()) {
                        return returnJsonResult;
                    }
                } catch (Exception e) {
                    return JSON.parseObject(returnJsonResult, returnType);
                }
            }
        }
        return null;
    }


}

工具类:主要用了反射机制

package com.zddts.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import java.util.Map.Entry;

public class BeanUtils {

    /**
     * 方法说明:将List<Map>转换为List<Bean>
     *
     * @param mapList
     * @param cls
     * @return
     * @throws Exception
     */
    public static List<Object> mapListToBeanList(
            List<Map<String, Object>> mapList, Class<?> cls) throws Exception {
        if (mapList == null || mapList.size() == 0) {
            return null;
        }
        List<Object> beanList = new ArrayList<Object>();
        Object bean = null;
        for (Map<String, Object> map : mapList) {
            bean = mapToBean(map, cls);
            if (bean == null) {
                continue;
            }
            beanList.add(bean);
        }
        return beanList;
    }

    /**
     * 设置bean 属性值,没有下划线的
     *
     * @param map
     * @param cls
     * @return
     * @throws Exception
     */
    public static Object mapToBeanNL(Map<String, Object> map, Class<?> cls) throws Exception {
        if (map == null || map.size() == 0) {
            return null;
        }
        Object obj = cls.newInstance();
        for (Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            if (value == null) {
                continue;
            }
            // 判断字段是否存在
            String fieldName = key;
            Field field = getBeanField(cls, fieldName);
            if (field == null) {
                continue;
            }
            // 判断字段的set方法是否存在
            String setMethodName = StringUtils.pareSetName(fieldName);
            Method method = getBeanMethod(cls, setMethodName, field.getType());
            if (method == null) {
                continue;
            }

            String fieldType = field.getType().getSimpleName();
            if ("String".equals(fieldType)) {
                method.invoke(obj, value.toString());
            } else if ("long".equals(fieldType) || "Long".equals(fieldType)) {
                method.invoke(obj, Long.valueOf(value.toString()));
            } else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {
                method.invoke(obj, value.toString());
            } else if ("double".equals(fieldType) || "Double".equals(fieldType)) {
                method.invoke(obj, Double.valueOf(value.toString()));
            } else if ("float".equals(fieldType) || "Float".equals(fieldType)) {
                method.invoke(obj, Float.valueOf(value.toString()));
            } else if ("boolean".equals(fieldType) || "Boolean".equals(fieldType)) {
                if (value.getClass().equals(Boolean.class)) {
                    method.invoke(obj, (Boolean) value);
                } else {
                    method.invoke(obj, Boolean.valueOf(value.toString()));
                }
            } else if ("Date".equals(fieldType)) {
                if (value != null) {
                    if (value.getClass().equals(Date.class)) {
                        method.invoke(obj, (Date) value);
                    } else {
                        method.invoke(obj, DateUtils.strToDate(value.toString()));
                    }
                }
            }
        }
        return obj;
    }

    /**
     * 设置bean 属性值
     *
     * @param map
     * @param cls
     * @return
     * @throws Exception
     */
    public static Object mapToBean(Map<String, Object> map, Class<?> cls)
            throws Exception {
        if (map == null || map.size() == 0) {
            return null;
        }
        Object obj = cls.newInstance();
        for (Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            if (value == null) {
                continue;
            }
            // 判断字段是否存在
            String fieldName = StringUtils.toUnderLine(key.toLowerCase());
            Field field = getBeanField(cls, fieldName);
            if (field == null) {
                continue;
            }
            // 判断字段的set方法是否存在
            String setMethodName = StringUtils.pareSetName(fieldName);
            Method method = getBeanMethod(cls, setMethodName, field.getType());
            if (method == null) {
                continue;
            }

            String fieldType = field.getType().getSimpleName();
            if ("String".equals(fieldType)) {
                method.invoke(obj, value.toString());
            } else if ("long".equals(fieldType) || "Long".equals(fieldType)) {
                method.invoke(obj, Long.valueOf(value.toString()));
            } else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {
                method.invoke(obj, value.toString());
            } else if ("double".equals(fieldType) || "Double".equals(fieldType)) {
                method.invoke(obj, Double.valueOf(value.toString()));
            } else if ("float".equals(fieldType) || "Float".equals(fieldType)) {
                method.invoke(obj, Float.valueOf(value.toString()));
            } else if ("boolean".equals(fieldType)
                    || "Boolean".equals(fieldType)) {
                if (value.getClass().equals(Boolean.class)) {
                    method.invoke(obj, (Boolean) value);
                } else {
                    method.invoke(obj, Boolean.valueOf(value.toString()));
                }
            } else if ("Date".equals(fieldType)) {
                if (value != null) {
                    if (value.getClass().equals(Date.class)) {
                        method.invoke(obj, (Date) value);
                    } else {
                        method.invoke(obj, DateUtils
                                .strToDate(value.toString()));
                    }
                }
            }
        }
        return obj;
    }

    /**
     * 方法说明:将List<Bean>转换为List<Map>
     *
     * @param beanList
     * @return
     * @throws Exception
     */
    public static List<Map<String, Object>> beanListToMapList(
            List<Map<String, Object>> beanList) throws Exception {
        if (beanList == null || beanList.size() == 0) {
            return null;
        }
        List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = null;
        for (Object bean : beanList) {
            map = beanToMap(bean);
            if (map == null || map.size() == 0) {
                continue;
            }
            mapList.add(map);
        }
        return mapList;
    }

    /**
     * 设置bean 属性值
     *
     * @param bean
     * @return
     * @throws Exception
     */
    public static Map<String, Object> beanToMap(Object bean) throws Exception {
        if (bean == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<String, Object>();
        Class<?> cls = bean.getClass();
        Field fields[] = cls.getDeclaredFields();
        for (Field field : fields) {
            String fieldName = field.getName();
            String fieldType = field.getType().getSimpleName();
            boolean isBooleanType = false;
            if (fieldType.equals("boolean") || fieldType.equals("Boolean")) {
                isBooleanType = true;
            }
            String getMethodName = StringUtils.pareGetName(fieldName,
                    isBooleanType);
            // 判断字段的无参get方法是否存在
            Method method = getBeanMethod(cls, getMethodName, new Class[]{});
            if (method == null) {
                continue;
            }
            Object fieldValue = method.invoke(bean, new Object[]{});
            map.put(StringUtils.toUnderLine(field.getName()).toUpperCase(),
                    fieldValue);
        }
        return map;
    }

    /**
     * 判断该方法是否存在
     *
     * @param methods
     * @param met
     * @return
     */
    public static boolean checkMethod(Method methods[], String met) {
        if (null != methods) {
            for (Method method : methods) {
                if (met.equals(method.getName())) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 方法说明:获取bean的指定方法
     * <p>
     * <p>
     * Author: zhenqiangs Create Date: 2016-4-30 下午01:07:12 History: 2016-4-30
     * 下午01:07:12 zhenqiangs Created.
     *
     * @param cls
     * @param methodName
     * @param paramTypes
     * @return
     */
    private static Method getBeanMethod(Class<?> cls, String methodName,
                                        Class<?>... paramTypes) {
        if (cls == null) {
            return null;
        }
        Method setMethod = null;
        try {
            setMethod = cls.getMethod(methodName, paramTypes);
        } catch (Exception e) {

        }
        return setMethod;
    }

    /**
     * 方法说明:获取bean的指定属性
     *
     * @param cls
     * @param fieldName
     * @return
     */
    public static Field getBeanField(Class<?> cls, String fieldName) {
        if (cls == null) {
            return null;
        }
        Field field = null;
        try {
            field = cls.getDeclaredField(fieldName);
        } catch (Exception e) {

        }
        return field;
    }

    /**
     * 设置对应值
     *
     * @param fieldName
     */
    public static void setBeanField(Class<?> cls, Object obj, String fieldName, Object value) throws Exception {

        // 判断字段是否存在
        Field field = getBeanField(cls, fieldName);
        if (field == null) {
            return;
        }
        // 判断字段的set方法是否存在
        String setMethodName = StringUtils.pareSetName(fieldName);
        Method method = getBeanMethod(cls, setMethodName, field.getType());
        if (method == null) {
            return;
        }
        //为空不设置
        if (value == null) {
            return;
        }
        String fieldType = field.getType().getSimpleName();
        if ("String".equals(fieldType)) {
            method.invoke(obj, value.toString());
        } else if ("long".equals(fieldType) || "Long".equals(fieldType)) {
            method.invoke(obj, Long.valueOf(value.toString()));
        } else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {
            method.invoke(obj, value.toString());
        } else if ("double".equals(fieldType) || "Double".equals(fieldType)) {
            method.invoke(obj, Double.valueOf(value.toString()));
        } else if ("float".equals(fieldType) || "Float".equals(fieldType)) {
            method.invoke(obj, Float.valueOf(value.toString()));
        } else if ("boolean".equals(fieldType) || "Boolean".equals(fieldType)) {
            if (value.getClass().equals(Boolean.class)) {
                method.invoke(obj, (Boolean) value);
            } else {
                method.invoke(obj, Boolean.valueOf(value.toString()));
            }
        } else if ("Date".equals(fieldType)) {
            if (value.getClass().equals(Date.class)) {
                method.invoke(obj, (Date) value);
            } else {
                method.invoke(obj, DateUtils.strToDate(value.toString()));
            }
        }
    }

    /**
     * 设置对应值
     *
     * @param fieldName
     */
    public static Object getBeanFieldValue(Class<?> cls, Object obj, String fieldName) throws Exception {

        // 判断字段是否存在
        Field field = getBeanField(cls, fieldName);
        // 判断字段的set方法是否存在
        String getMethodName = StringUtils.pareGetName(fieldName, false);
        // 判断字段的无参get方法是否存在
        Method method = getBeanMethod(cls, getMethodName, new Class[]{});
        Object fieldValue = method.invoke(obj, new Object[]{});
        return fieldValue;
    }
}

StringUtils

/**
 *
 */
package com.zddts.common.utils;

import java.net.URLEncoder;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Luojie
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {

    /**
     * 合并字符串数组为一个串
     *
     * @param src       String[] 字符串数组
     * @param delimiter 隔开字符
     * @return String
     */
    public static String merge(String[] src, String delimiter) {
        StringBuffer newSrc = new StringBuffer();
        for (int i = 0; i < src.length; i++) {
            if (i < src.length - 1) {
                newSrc.append(src[i]).append(delimiter);
            } else {
                newSrc.append(src[i]);
            }
        }
        return newSrc.toString();
    }

    /**
     * 分解字符串
     *
     * @param str  String
     * @param sect int 分解的段数
     * @param len  int 每段的字符长度
     * @return String[]
     * @throws Exception
     */
    static public String[] split(String str, int sect, int len)
            throws Exception {
        String[] result = new String[sect];
        int j = 0;
        for (j = 0; j < sect; j++) {
            result[j] = "";
        }
        for (j = 0; j < sect; j++) {
            if (str.length() < len * j) {
                break;
            } else if (str.length() < len * (j + 1)) {
                result[j] = str.substring(len * j, str.length());
            } else {
                result[j] = str.substring(len * j, len * (j + 1));
            }
        }
        return result;
    }

    /**
     * 对整个url进行编码转换
     *
     * @param srcStr   url串
     * @param encoding 编码
     * @return String
     */
    public static String URLEncode(String srcStr, String encoding) {
        String[] arrayUrl = srcStr.split("?");
        if (arrayUrl.length <= 1) {
            return srcStr;
        }
        String qryStr = arrayUrl[1];
        String[] arrayQryStr = qryStr.split("&");
        StringBuffer newQryStr = new StringBuffer(120);
        StringBuffer tmp = new StringBuffer(20);
        String param;
        for (int i = 0; i < arrayQryStr.length; i++) {
            param = arrayQryStr[i];
            String[] arrayParam = param.split("=");
            if (arrayParam.length > 1) {
                try {
                    arrayParam[1] = URLEncoder.encode(arrayParam[1], encoding);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                tmp.append(arrayParam[0]).append("=").append(arrayParam[1]);
                arrayQryStr[i] = tmp.toString();
            } else {
                tmp.append(arrayParam[0]).append("=");
                arrayQryStr[i] = tmp.toString();
            }
            newQryStr.append(arrayQryStr[i]).append("&");
        }
        tmp = new StringBuffer(150);
        tmp.append(arrayUrl[0]).append("?").append(newQryStr.toString());
        return tmp.toString();
    }

    /**
     * 用 newString 替换 line 中的所有的 OldString。 不支持正则表达式
     *
     * @param line      原字符串
     * @param oldString 被替换的字符串
     * @param newString 新的要替换oldString的字符串
     * @return 返回所有oldString都被newString替换的字符串
     */
    public static final String replace(String line, String oldString,
                                       String newString) {
        // 如果line是null,直接返回
        if (line == null) {
            return null;
        }
        int i = 0;
        // 如果在line中确实存在oldString那么将进行以下的替换
        if ((i = line.indexOf(oldString, i)) >= 0) {
            char[] line2 = line.toCharArray();
            char[] newString2 = newString.toCharArray();
            int oLength = oldString.length();
            StringBuffer buf = new StringBuffer(line2.length);
            buf.append(line2, 0, i).append(newString2);
            i += oLength;
            int j = i;
            while ((i = line.indexOf(oldString, i)) > 0) {
                buf.append(line2, j, i - j).append(newString2);
                i += oLength;
                j = i;
            }
            buf.append(line2, j, line2.length - j);
            return buf.toString();
        }
        // 如果在line中没有oldString 返回line
        return line;
    }

    /**
     * 用 newString 替换 line 中的所有的 OldString count返回被替换的数目
     *
     * @param line      原字符串
     * @param oldString 被替换的字符串
     * @param newString 新的要替换oldString的字符串
     * @return 返回所有oldString都被newString替换的字符串
     */
    public static final String replace(String line, String oldString,
                                       String newString, int[] count) {
        if (line == null) {
            return null;
        }
        int i = 0;
        if ((i = line.indexOf(oldString, i)) >= 0) {
            int counter = 0;
            counter++;
            char[] line2 = line.toCharArray();
            char[] newString2 = newString.toCharArray();
            int oLength = oldString.length();
            StringBuffer buf = new StringBuffer(line2.length);
            buf.append(line2, 0, i).append(newString2);
            i += oLength;
            int j = i;
            while ((i = line.indexOf(oldString, i)) > 0) {
                counter++;
                buf.append(line2, j, i - j).append(newString2);
                i += oLength;
                j = i;
            }
            buf.append(line2, j, line2.length - j);
            count[0] = counter;
            return buf.toString();
        }
        return line;
    }

    /**
     * 做不区分大小写的模式匹配,并用newString 来替换 oldString
     *
     * @param line      原字符串
     * @param oldString 被替换的字符串
     * @param newString 新的要替换oldString的字符串
     * @return 返回所有oldString都被newString替换的字符串
     */
    public static final String replaceIgnoreCase(String line, String oldString,
                                                 String newString) {
        // 如果line是null,直接返回
        if (line == null) {
            return null;
        }
        String lcLine = line.toLowerCase();
        String lcOldString = oldString.toLowerCase();
        int i = 0;
        if ((i = lcLine.indexOf(lcOldString, i)) >= 0) {
            char[] line2 = line.toCharArray();
            char[] newString2 = newString.toCharArray();
            int oLength = oldString.length();
            StringBuffer buf = new StringBuffer(line2.length);
            buf.append(line2, 0, i).append(newString2);
            i += oLength;
            int j = i;
            while ((i = lcLine.indexOf(lcOldString, i)) > 0) {
                buf.append(line2, j, i - j).append(newString2);
                i += oLength;
                j = i;
            }
            buf.append(line2, j, line2.length - j);
            return buf.toString();
        }
        return line;
    }

    /**
     * 从数组中得到字符串的位置
     *
     * @param s    要查询的字符串
     * @param args 待查的数组
     * @return s的位置,没有找到就是-1
     */
    public static int getStrIndex(String s, String args[]) {
        int length = args.length;
        for (int i = 0; i < length; i++) {
            if (args[i].equals(s)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 判断 如果输入的字符为null或者'null',输出空字符串""
     *
     * @param src
     * @return
     */
    public static String nullToEmpty(String src) {
        if (src == null || src.equalsIgnoreCase("NULL")) {

            return "";
        }
        return src;
    }

    /**
     * 将下划线连接的String替换为驼峰风格
     *
     * @param s
     * @return
     */
    public static String toCamelCasing(String s) {
        if (s == null) {
            return s;
        }

        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < s.length() - 1; i++) {
            char ch = s.charAt(i);
            if (ch != '_') {
                buffer.append(ch);
            } else {
                char nextChar = s.charAt(i + 1);
                if (nextChar != '_') {
//             if (buffer.toString().length() < 2) {
//                buffer.append(Character.toLowerCase(nextChar));
//             } else {
                    buffer.append(Character.toUpperCase(nextChar));
//             }
                    i++;
                }
            }
        }
        char lastChar = s.charAt(s.length() - 1);
        if (lastChar != '_') {
            buffer.append(lastChar);
        }

        return buffer.toString();
    }

    /**
     * 将驼峰结构的字符串转换为下划线连接的形式
     *
     * @param s
     * @return
     */
    public static String toUnderLine(String s) {
        if (s == null) {
            return s;
        }

        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < s.length() - 1; i++) {
            char ch = Character.toLowerCase(s.charAt(i));
            char nextChar = s.charAt(i + 1);
            if (Character.isUpperCase(nextChar)) {
                buffer.append(ch).append('_');
            } else {
                buffer.append(ch);
            }
        }
        char lastChar = s.charAt(s.length() - 1);
        buffer.append(Character.toLowerCase(lastChar));

        return buffer.toString();
    }

    /**
     * 将首字母小写
     *
     * @param s
     * @return
     */
    public static String lowerFirstChar(String s) {
        if (s == null || s.trim().equals("")) {
            return null;
        }
        StringBuffer buffer = new StringBuffer();
        buffer.append(Character.toLowerCase(s.charAt(0)))
                .append(s.substring(1));
        return buffer.toString();
    }

    /**
     * 将首字母大写
     *
     * @param s
     * @return
     */
    public static String upperFirstChar(String s) {
        if (s == null || s.trim().equals("")) {
            return null;
        }
        StringBuffer buffer = new StringBuffer();
        buffer.append(Character.toUpperCase(s.charAt(0)))
                .append(s.substring(1));
        return buffer.toString();
    }

    /**
     * 拼接某属性get 方法
     *
     * @param isBooleanType 属性是否为boolean型
     * @return
     */
    public static String pareGetName(String fieldName, Boolean isBooleanType) {
        String str = StringUtils.upperFirstChar(fieldName);
        if (str == null) {
            return null;
        }
        if (isBooleanType) {
            return "is" + str;
        } else {
            return "get" + str;
        }
    }

    /**
     * 拼接某属性set 方法
     *
     * @return
     */
    public static String pareSetName(String fieldName) {
        String str = StringUtils.upperFirstChar(fieldName);
        if (str == null) {
            return null;
        }
        String pro = "set" + str;
        return pro;
    }

    /**
     * 方法说明:判断字符串是否为空
     *
     * @param paramString
     * @return
     */
    public static boolean nullOrBlank(String paramString) {
        return (paramString == null) || (paramString.trim().equals(""));
    }

    /**
     * 方法说明:判断字符串是否为空
     * List
     *
     * @return
     */
    public static boolean notNullOrBlankList(List list) {

        if (list == null || list.size() == 0) {
            return false;
        }
        return true;
    }

    /**
     * 方法说明:字符串为空时给默认值
     *
     * @param str
     * @param defaultValue
     * @return
     */
    public static String strNvl(String str, String defaultValue) {
        if (nullOrBlank(str)) {
            return defaultValue;
        }
        return str;
    }

    /**
     * 方法说明:字符串为空时给默认值
     *
     * @param strObj
     * @param defaultValue
     * @return
     */
    public static String strObjNvl(Object strObj, String defaultValue) {
        String str = null;
        if (strObj != null) {
            str = strObj.toString();
        }
        return strNvl(str, defaultValue);
    }

    /**
     * 方法说明:获取第N个a字符后面的所有字符
     * <p>
     * <p>
     * Author: 高宝阳 Create Date: May 5, 2016 6:04:10 PM History: May 5, 2016
     * 6:04:10 PM Administrator Created.
     *
     * @param sChar
     * @param n
     * @return
     */
    public static String getNCharAfter(String sInput, String sChar, int n) {
        // 这里是获取sChar符号的位置
        String str = null;
        int m = 1;
        int i = 0;
        while (sInput.indexOf(sChar, i) >= 0) {
            i = sInput.indexOf(sChar, i) + 1;
            if (n == m) {
                str = sInput.substring(i, sInput.length());
                break;
            }
            m = m + 1;
        }
        return str;
    }

    /**
     * 根据传入的字符串判断将来的数组长度,用于系统参数的解析
     *
     * @param sInput 字符串
     * @return
     * @throws Exception
     */
    public static int getArrLen(String sInput) throws Exception {
        int len = 0;
        int i = 0;
        while (sInput.indexOf("$", i) > 0) {
            i = sInput.indexOf("$", i) + 1;
            len = len + 1;
        }
        return len;
    }

    /**
     * 字符串解释成数组
     *
     * @param sInput 字符串格式:例如:w$m$n$o$p$ w: 位数;m、n、o、p分别为字符串;如实际的例子:4$122$+$01$1$
     * @return
     * @throws Exception
     */
    public static String[] stringParse(String sInput) throws Exception {
        String[] sRet = null;
        try {
            int len = getArrLen(sInput);
            int m = -1;
            sRet = new String[len];
            for (int j = 0; j < len; j++) { // 数组
                sRet[j] = sInput.substring(m + 1, sInput.indexOf("$", m + 1));
                m = sInput.indexOf("$", m + 1);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new Exception(e.getMessage());
        }
        return sRet;
    }

    /**
     * replaceBlank
     *
     * @param in
     * @return
     * @description replaceBlank
     */
    public static String replaceBlank(String in) {
        Pattern p = Pattern.compile("\\s*|\t|\r|\n");
        Matcher m = p.matcher(in);
        String after = m.replaceAll("");
        return after;
    }

    /**
     * 删除起始字符
     *
     * @param str
     * @return
     * @author xxj 2017年4月27日
     */
    public static String trimStart(String str, String trim) {
        if (str == null) {

            return null;
        }
        return str.replaceAll("^(" + trim + ")+", "");
    }

    /**
     * 删除末尾字符
     *
     * @param str
     * @return
     * @author xxj 2017年4月27日
     */
    public static String trimEnd(String str, String trim) {
        if (str == null)
            return null;
        return str.replaceAll("(" + trim + ")+$", "");


    }

    public static Object nullToDefault(Object obj, Object def) {
        if (obj == null) {
            return def;
        }
        return obj;
    }

    private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元角分";
    private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖";
    private static final double MAX_VALUE = 9999999999999.99D;

    public static String changeMoney(double v) {
        if (v < 0 || v > MAX_VALUE) {
            return "参数非法!";
        }
        long l = Math.round(v * 100);
        if (l == 0) {
            return "零元整";
        }
        String strValue = l + "";
        // i用来控制数
        int i = 0;
        // j用来控制单位
        int j = UNIT.length() - strValue.length();
        String rs = "";
        boolean isZero = false;
        for (; i < strValue.length(); i++, j++) {
            char ch = strValue.charAt(i);
            if (ch == '0') {
                isZero = true;
                if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') {
                    rs = rs + UNIT.charAt(j);
                    isZero = false;
                }
            } else {
                if (isZero) {
                    rs = rs + "零";
                    isZero = false;
                }
                rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j);
            }
        }
        if (!rs.endsWith("分")) {
            rs = rs + "整";
        }
        rs = rs.replaceAll("亿万", "亿");
        return rs;
    }

    public static boolean isBlank(String str) {
        if (str == null || "".equals(str.trim())) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean isNotBlank(String str) {
        if (str != null && !"".equals(str.trim())) {
            return true;
        } else {
            return false;
        }
    }

    public static String isGoodPat(String patNo) {
        patNo = patNo.replaceFirst("[a-zA-Z]*", "").replace(".", "").replace(" ", "");
        if (!patNo.substring(0, patNo.length() - 1).matches("[0-9]*$") || (patNo.length() != 13 && patNo.length() != 7)) {
            return null;
        }
        return patNo;
    }

    /**
     * 更具专利号判断专利类型
     *  一定要是中国13位专利
     * @param patNo
     * @return
     */
    public static String getPatType(String patNo) {

        if (StringUtils.isEmpty(patNo) || patNo.length() <= 5)
            return null;

        String patType = patNo.substring(4, 5);

        if ("8".equals(patType))
            patType = "1";

        if ("9".equals(patType))
            patType = "2";


        return patType;

    }

    public static void main(String args[]) {
        System.out.print(isGoodPat("20171141704x"));
    }

}

使用:

需要注解翻译的BO对象属性上加上注解DataDict ,dict是指标准码的编码或者用户UserBo的属性 (字典名称),

source 值字段翻译值的来源

spring boot个人博客的数据字典 springboot字典配置_spring_03

//汇聚类的字典解析相应配置上 transFerLineColumn 如逗号拆分的配置“,”

字典配置:1 = 出售  2 =结算

数据库聚合存储的为1,2 需要翻译的

效果如图:

spring boot个人博客的数据字典 springboot字典配置_java_04

//用户字段使用方法

spring boot个人博客的数据字典 springboot字典配置_字符串_05

dao层 使用:

spring boot个人博客的数据字典 springboot字典配置_redis_06

或者service 层  使用:

spring boot个人博客的数据字典 springboot字典配置_redis_07

对要数据字典转换的方法加上DataDictClass注解

执行效果

spring boot个人博客的数据字典 springboot字典配置_java_02