【问题标题】:JedisPoolConfig is not assignable to GenericObjectPoolConfigJedisPoolConfig 不可分配给 GenericObjectPoolConfig
【发布时间】:2014-05-07 10:10:50
【问题描述】:

我有一个托管在 Heroku 上的基于 Spring 的 Java Web 应用程序。我正在尝试使用 Redis 实现来利用 Spring Caching 抽象。当服务器启动时,我收到一条错误消息:

Type 'redis/clients/jedis/JedisPoolConfig' (current frame, stack[3]) is not assignable to 'org/apache/commons/pool2/impl/GenericObjectPoolConfig'

这是我的配置:

@Bean
     RedisConnectionFactory jedisConnectionFactory() throws Exception {
         URI redisUri =  new URI(System.getenv("REDISCLOUD_URL"));
         JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
         redisConnectionFactory.setHostName(redisUri.getHost());
         redisConnectionFactory.setPort(redisUri.getPort());
         redisConnectionFactory.setPassword(redisUri.getUserInfo().split(":",2)[1]);
         redisConnectionFactory.setUsePool(true);
         return redisConnectionFactory;
     }

 @Bean
 RedisTemplate<Object, Object> redisTemplate()  {
     RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
     try {
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     return redisTemplate;
 }
@Override
@Bean
public CacheManager cacheManager() {
    // configure and return an implementation of Spring's CacheManager SPI
    RedisCacheManager manager = new RedisCacheManager(redisTemplate());
    List<String> caches = new ArrayList<String>();
    caches.add("Suppliers");
    caches.add("Manufacturer");
    caches.add("Sheeting");
    caches.add("SignTypeFlat");
    manager.setCacheNames(caches);
    return manager;
}

这是完整的错误信息:

 Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory m ethod [org.springframework.data.redis.connection.RedisConnectionFactory com.signInventory.config.ProdDataSourceConfiguration.jedisConnectionFactory() throws java.lang.Exception] threw exception; nested exception is java.lang.VerifyError: Bad type on operand stack Exception Details:   Location:
    org/springframework/data/redis/connection/jedis/JedisConnectionFactory.afterPropertiesSet()V @109: invokespecial   Reason:
    Type 'redis/clients/jedis/JedisPoolConfig' (current frame, stack[3]) is not assignable to 'org/apache/commons/pool2/impl/GenericObjectPoolConfig'   Current Frame:
    bci: @109
    flags: { }
    locals: { 'org/springframework/data/redis/connection/jedis/JedisConnectionFactory' }
    stack: { 'org/springframework/data/redis/connection/jedis/JedisConnectionFactory', uninitialized 73, uninitialized 73, 'redis/clients/jedis/JedisPoolConfig', 'java/lang/String', integer, integer, 'java/lang/String' }   Bytecode:
    0000000: 2ab4 000d c700 3d2a bb00 1759 2ab4 0003
    0000010: 2ab4 0004 b700 18b5 000d 2ab4 0019 b800
    0000020: 1a99 000e 2ab4 000d 2ab4 0019 b600 1b2a
    0000030: b400 059e 000e 2ab4 000d 2ab4 0005 b600
    0000040: 1c2a b400 0699 002e 2abb 001d 592a b400
    0000050: 0a2a b400 0db6 001e 2ab4 000d b600 1f2a
    0000060: b400 0db6 0020 2ab4 000d b600 21b7 0022
    0000070: b500 07b1   Stackmap Table:
    same_frame(@47)
    same_frame(@65)
    same_frame(@115) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:181) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:578) ... 36 more Caused by: java.lang.VerifyError: Bad type on operand stack Exception Details:   Location:
    org/springframework/data/redis/connection/jedis/JedisConnectionFactory.afterPropertiesSet()V @109: invokespecial   Reason:
    Type 'redis/clients/jedis/JedisPoolConfig' (current frame, stack[3]) is not assignable to 'org/apache/commons/pool2/impl/GenericObjectPoolConfig'   Current Frame:
    bci: @109
    flags: { }
    locals: { 'org/springframework/data/redis/connection/jedis/JedisConnectionFactory' }
    stack: { 'org/springframework/data/redis/connection/jedis/JedisConnectionFactory', uninitialized 73, uninitialized 73, 'redis/clients/jedis/JedisPoolConfig', 'java/lang/String', integer, integer, 'java/lang/String' }   Bytecode:
    0000000: 2ab4 000d c700 3d2a bb00 1759 2ab4 0003
    0000010: 2ab4 0004 b700 18b5 000d 2ab4 0019 b800
    0000020: 1a99 000e 2ab4 000d 2ab4 0019 b600 1b2a
    0000030: b400 059e 000e 2ab4 000d 2ab4 0005 b600
    0000040: 1c2a b400 0699 002e 2abb 001d 592a b400
    0000050: 0a2a b400 0db6 001e 2ab4 000d b600 1f2a
    0000060: b400 0db6 0020 2ab4 000d b600 21b7 0022
    0000070: b500 07b1   Stackmap Table:
    same_frame(@47)
    same_frame(@65)
    same_frame(@115) at com.signInventory.config.ProdDataSourceConfiguration.jedisConnectionFactory(ProdDataSourceConfiguration.java:46) at com.signInventory.config.ProdDataSourceConfiguration$$EnhancerByCGLIB$$258faa2b.CGLIB$jedisConnectionFactory$8(<generated>) at com.signInventory.config.ProdDataSourceConfiguration$$EnhancerByCGLIB$$258faa2b$$FastClassByCGLIB$$b4f3aedd.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:286) at com.signInventory.config.ProdDataSourceConfiguration$$EnhancerByCGLIB$$258faa2b.jedisConnectionFactory(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:160) ... 37 more

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: java spring caching redis jedis


    【解决方案1】:

    当我升级到 Spring Data Redis v1.2.1-RELEASE 时遇到了完全相同的问题。我在将 Jedis 升级到最新版本 v2.4.2 后解决了这个问题。如果您使用的是 Maven,请检查以下依赖项。

    <properties>
        <spring.data.redis>1.2.1.RELEASE</spring.data.redis>
        <jedis>2.4.2</jedis>
    </properties>
    
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>${spring.data.redis}</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>${jedis}</version>
    </dependency>
    

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      您需要添加对 apache commons-pool2 库的引用。我在 Scala 项目中遇到了同样的问题——我们使用的是 sbt,所以这只是添加的一个例子:

      "org.apache.commons" % "commons-pool2" % "2.0"
      

      当您使用 Java 时,您可能正在使用 Maven,所以我预计它可能更像这样(未经测试 - 用少许盐!):

      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.0</version>
      </dependency>
      

      【讨论】:

        【解决方案3】:
        【解决方案4】:

        如果有人因为从 Spring Boot 1.5.x 迁移到 2.x.x 而面临它,这里是 thread 来解释它。也请看这个link

        现在使用 Lettuce 代替 Jedis 作为 Redis 驱动程序 你使用 spring-boot-starter-data-redis。如果您使用更高级别 Spring Data 构造你应该会发现变化是透明的。

        我们仍然支持 Jedis。如果您更喜欢 Jedis,请通过以下方式切换依赖项 不包括 io.lettuce:lettuce-core 并添加 redis.clients:jedis 而是。

        连接池是可选的,如果您正在使用它,您现在需要 将 commons-pool2 自己添加为 Lettuce,与 Jedis 不同,不会 带上它。

        【讨论】:

          猜你喜欢
          • 2017-10-30
          • 2017-07-05
          • 2021-10-29
          • 2020-08-20
          • 1970-01-01
          • 2023-01-09
          • 2018-04-22
          • 2019-03-19
          • 2021-09-26
          相关资源
          最近更新 更多