Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中(补充)

文章目录

        • 前言
        • 步骤
        • 测试结果
前言
步骤
  1. 在EnumService接口创建一个方法,负责查询枚举类的值。

    java 复制代码
    public interface EnumService {
        /**
         * 获取枚举类
         * 支持通过field模糊查询
         * 
         * @param field redis hash 存储中 的 field(HashMap中的key)
         * @return 枚举类
         */
        Map<String, List<EnumDto>> getEnumValues(String field);
        
        //其他方法....
    }
  2. 在EnumServiceImpl中实现getEnumValues方法。

    java 复制代码
    @Service
    @Slf4j
    public class EnumServiceImpl implements EnumService {
        @Autowired
        private RedisOperation redisOperation;
    
        @Override
        public Map<String, List<EnumDto>> getEnumValues(String field) {
            Map<String, List<EnumDto>> returnObj = new HashMap<>();
            Map<Object, Object> obj;
            if (StringUtils.isBlank(field)) {
                //获取所有枚举类的信息
                obj = redisOperation.hgetAll(RedisKeyConstant.SYSTEM_ENUMS_CACHE_KEY);
            } else {
                //下面是针对需要进行模糊匹配进行的查询
                obj = redisOperation.hscan(RedisKeyConstant.SYSTEM_ENUMS_CACHE_KEY, field);
            }
            obj.forEach((redisKey, val) ->
                    returnObj.put((String) redisKey, (ArrayList) val));
            return returnObj;
        }
    }
  3. 下面给出EnumServiceImpl中出现的一些RedisOperation中的方法代码

    java 复制代码
    @Slf4j
    @Component
    public final class RedisOperation {
        private RedisTemplate<String, Object> redisTemplate;
    
        public RedisOperation(RedisTemplate<String, Object> redisTemplate) {
            this.redisTemplate = redisTemplate;
        }
        /**
         * 返回哈希表 key 中,所有的域和值
         */
        public Map<Object, Object> hgetAll(String key) {
             return redisTemplate.opsForHash().entries(key);
        }
    
        /**
         * 针对HashKey进行  field 的模糊匹配
         *
         * @param key   redis的HashKey  精确匹配
         * @param field reidis 的HashKey中的 field 类似于java中的HashMap中的key
         * @return 根据精确匹配key 和 模糊匹配 field 获取存储在redis中 的 HashMap
         */
        public Map<Object, Object> hscan(String key, String field) {
            Cursor<Map.Entry<Object, Object>> cursor = null;
            Map<Object, Object> map = new HashMap<>();
            try {
                cursor = redisTemplate.opsForHash().scan(key, ScanOptions.scanOptions().count(Integer.MAX_VALUE).match("*" + field + "*").build());
                while (cursor.hasNext()) {
                    Map.Entry<Object, Object> entry = cursor.next();
                    map.put(entry.getKey(), entry.getValue());
                }
                return map;
            } catch (Exception e) {
                log.error("redis模糊查询获取 HashMap error!", e);
            } finally {
                if (null != cursor) {
                    cursor.close();
                }
            }
            return map;
        }
    
        //其他方法...
    }
  4. 在Controller里定义接口,还记得EnumInterface接口里的enumDesc()方法吧,它返回了我们定义的枚举类描述值,我们可以通过这个描述来作为下面接口的field属性,进行模糊查询。

    java 复制代码
    @RestController
    @RequestMapping("/part/util")
    public class UtilController {
        @Autowired
        private EnumService enumService;
        @ApiOperation("获取JAVA枚举值列表")
        @GetMapping("/getEnumValues")
        public Result getEnumValues(@ApiParam(name = "field", value = "field(HashMap中的key)") @RequestParam(value = "field") String field) {
            return Result.ok().data(enumService.getEnumValues(field));
        }
    }
测试结果
  1. 采用postman测试结果,当输入的field为空时,返回所有枚举值:

2. 当输入的field不为空,根据field进行模糊查询,返回结果:

相关推荐
乐之者v几秒前
leetCode43.字符串相乘
java·数据结构·算法
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫9 小时前
泛型(2)
java
超爱吃士力架9 小时前
邀请逻辑
java·linux·后端
南宫生9 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石9 小时前
12/21java基础
java