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

前言
  • 新的一年即将来到,回首2023年,也是学习了许多,不断进步。今天带来的是项目中遇到的一个业务要求处理方法总结:项目具有很多的枚举类,而这些枚举类在前端页面中需要作为下拉框选项等组件被前端获取。为了后续获取枚举值更加方便快捷,我们在项目启动的时候将所有Java枚举类用一个hash存入Redis中,在提供一个接口,使得前端可以从Redis获取自己想要的枚举值。下文将讲解实现步骤。
实现项目启动时加载枚举值到Redis
1. 定义EnumInterface接口
  • 定义EnumInterface接口,实现该接口的枚举类会在后续被识别,在项目启动时加入redis
    public interface EnumInterface {
         
         
    
        String getCode();
    
        String getDesc();
     
        //枚举类描述 该值后续会与枚举类名拼接 成为Redis hash的key  
        String enumDesc();
      }
    
2. 创建EnumDTO
  • 创建EnumDTO,将存放每个枚举类对象,同一个枚举类的所有对象最终会放入同一个列表,作为Redis hash的value。
      @Data
      @ApiModel(value = "EnumDto", description = "【枚举值-枚举值DTO】")
      public class EnumDto implements Serializable {
         
         
    
          private static final long serialVersionUID = 1L;
      
          @ApiModelProperty(value = "枚举值类型-对应枚举值类名")
          private String typeEn;
      
          @ApiModelProperty(value = "枚举值类型-对应枚举值类名的desc描述信息")
          private String typeCh = "";
    
          @ApiModelProperty(value = "枚举值类型-对应枚举值的code值")
          private String code;
    
          @ApiModelProperty(value = "枚举值类型-对应枚举值的desc值")
          private String desc;
      
          @ApiModelProperty(value = "枚举值类型-对应枚举实例的名字")
          private String enumName;
    
      }
    
3. 创建ClassUtils工具类
  • 该类提供一个方法,通过Java反射获取某个包中所有的枚举类,将它们存入列表。
      @Slf4j
      public class ClassUtils {
         
         
          //为了方便管理,我们将枚举类放在同一个包下,这里写入自己项目中枚举类所在的包名。
          private static final String PACKAGE_NAME = "com.common.base.enums";
      
          public static List<Class<Enum>> getAllEnumClasses() throws ClassNotFoundException, IOException {
         
         
              List<Class<Enum>> list = new ArrayList<>();
              for (String className : getClassName(PACKAGE_NAME, true)) {
         
         
                  Class<?> clazz = Class.forName(className);
                  if (Enum.class.isAssignableFrom(clazz) && EnumInterface.class.isAssignableFrom(clazz)) {
         
         
                      list.add((Class<Enum>) clazz);
                  }
              }
              return list;
          }
          /**
           * 获取某包下的所有类
           * @param packageName  包名
           * @param childPackage 是否遍历子包
           */
          
<think>我们正在解决一个Java运行时异常:java.lang.ClassNotFoundException:redis.clients.jedis.GeoUnit。这个异常表示在类路径中找不到GeoUnit类。GeoUnit是Jedis中用于地理空间操作(如GEORADIUS)的枚举类。可能的原因和解决方案:1.Jedis版本过低:GeoUnit是在Jedis2.8.0版本中引入的。如果使用的Jedis版本低于2.8.0,则不存在这个类。-解决方案:升级Jedis到2.8.0或更高版本。2.依赖未正确引入:项目可能没有正确引入Jedis依赖,或者依赖作用域(scope)设置不正确(例如设置为test),导致编译时可用而运行时不可用。-解决方案:检查项目的构建文件(如Maven的pom.xml或Gradle的build.gradle),确保引入了正确版本的Jedis依赖,并且作用域为compile(默认)或runtime。3.依赖冲突:项目中可能存在多个版本的Jedis,导致实际使用的版本不包含GeoUnit类。-解决方案:使用Maven或Gradle的依赖树分析工具,排除多余的版本。4.部署问题:构建的包(如WAR、JAR)中可能没有包含Jedis的jar包。-解决方案:检查构建配置,确保打包时包含了所有依赖。5.类加载器问题:在复杂的环境中(如应用服务器),类加载器可能没有正确加载Jedis类。-解决方案:确保Jedis的jar包位于正确的类路径位置。具体步骤:###步骤1:检查Jedis版本在Maven项目中,检查pom.xml中Jedis的版本:```xml<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version><!--确保至少为2.8.0--></dependency>```在Gradle项目中,检查build.gradle:```groovyimplementation'redis.clients:jedis:3.7.0'```###步骤2:检查依赖是否被正确引入-对于Maven项目,运行`mvndependency:tree`查看依赖树,确认jedis被正确引入且没有冲突。-对于Gradle项目,运行`gradledependencies`。如果发现冲突,可以使用`<exclusion>`(Maven)或`exclude`(Gradle)排除低版本。###步骤3:清理和重新构建项目在IDE中执行清理操作,并重新构建项目。如果使用Maven,运行:```bashmvncleaninstall```###步骤4:检查部署包如果部署到服务器,检查打包后的文件(如WAR包)中是否包含jedis的jar包。可以在解压后的WEB-INF/lib目录下查找。###步骤5:检查类加载器在应用服务器中,确保jedis的jar包被放在应用类加载器可以加载的位置(如WEB-INF/lib)。###其他注意事项-如果使用SpringBoot,它可能管理了Jedis的版本。可以通过`mvndependency:tree`查看实际引入的版本。-确保没有重复引入不同版本的Jedis。如果以上步骤都尝试后仍然有问题,请检查代码中是否有使用反射加载类的地方,确保类名拼写正确(全限定名:`redis.clients.jedis.GeoUnit`)。参考引用[^1]中提到,版本问题可能导致类找不到,引用[^2][^3]也强调了类路径配置的重要性。因此,请重点检查版本和依赖配置。§§相关问题§§1.Jedis中GeoUnit类的作用是什么?2.如何使用Maven排除冲突的依赖版本?3.在SpringBoot中如何管理Jedis的版本?</think>### Java中 `java.lang.ClassNotFoundException: redis.clients.jedis.GeoUnit` 解决方案 `GeoUnit` 是 Jedis 中用于地理空间操作的枚举类(如 `GEORADIUS` 命令)。当出现此异常时,通常由以下原因导致: #### 1. **Jedis 版本过低**(最常见原因) - **问题**:`GeoUnit` 在 Jedis 2.8.0 及以上版本引入,旧版本无此类。 - **解决**: ```xml <!-- pom.xml 升级版本(推荐 3.x+) --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.0</version> <!-- 最低需 >=2.8.0 --> </dependency> ``` - **验证**:执行 `mvn dependency:tree | grep jedis` 确认实际版本。 #### 2. **依赖冲突** - **问题**:其他依赖(如 Spring Boot)覆盖了 Jedis 版本。 - **解决**:显式声明版本并排除冲突: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.0</version> <!-- 显式指定 --> </dependency> ``` #### 3. **构建/部署问题** - **场景**:编译通过但运行时缺少 JAR。 - **解决**: - Maven:执行 `mvn clean install -U` - IDE:检查 `Project Structure > Libraries` 是否包含 Jedis JAR - 服务器:确认部署包(WAR/JAR)的 `lib/` 目录包含 `jedis-*.jar` #### 4. **作用域错误** - **问题**:依赖被声明为 `test` 或 `provided` 作用域。 - **解决**:确保作用域为 `compile`(默认): ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.0</version> <scope>compile</scope> <!-- 或直接省略 --> </dependency> ``` #### 验证步骤 1. 检查运行时类路径: ```java System.out.println(ClassLoader.getSystemResource("redis/clients/jedis/GeoUnit.class")); ``` 2. 若返回 `null`,说明 JAR 未正确加载。 > **提示**:若使用 Spring Boot 2.x+,建议通过 `spring-boot-starter-data-redis` 间接管理 Jedis 版本[^2][^3]。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻馅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值