java.lang.ClassCastException:com.sun.proxy。$ Proxy219无法强制转换为org.springframework.data.redis.connection.StringRedisConnection

时间:2018-06-04 12:43:30

标签: java spring proxy redis cglib

这是redis,管道的功能。以前使用它,但今天我测试这个功能。它不起作用。

public List<Object> hgetpipeline(List<String> keys) {
        List<Object> results = redisTemplate.executePipelined(
                new RedisCallback<Object>() {
                    @Override
                    public Object doInRedis(RedisConnection connection) throws DataAccessException {
                        StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
                        for(int i=0; i< keys.size(); i++) {
                            stringRedisConn.hGetAll(keys.get(i)+"");
                        }
                        return null;
                    }
                });
      return results;
    }

此行发生了一些错误

StringRedisConnection stringRedisConn = (StringRedisConnection)connection;

有错误信息

java.lang.ClassCastException: 
com.sun.proxy.$Proxy219 cannot be cast to org.springframework.data.redis.connection.StringRedisConnection

主要班级的宣布

@SpringBootApplication
@EnableAsync
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@EnableScheduling
@RestController
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

    @RequestMapping("/")
    public String index() {
        return "Server started!";
    }

}

3 个答案:

答案 0 :(得分:0)

尝试

public List<Object> hgetpipeline(List<String> keys) {
        List<Object> results = redisTemplate.executePipelined(
                new RedisCallback<Object>() {
                    @Override
                    public Object doInRedis(RedisConnection connection) throws DataAccessException {

                        for(int i=0; i< keys.size(); i++) {
                            redisTemplate.hGetAll(keys.get(i)+"");
                        }
                        return null;
                    }
                });
      return results;
    }

答案 1 :(得分:0)

我认为在方法doInRedis中只使用连接而不是redisTemplate。

public List<Object> hgetpipeline(List<String> keys) {
    int i = 0;
    List<Object> results = redisTemplate.executePipelined(
            new RedisCallback<Object>() {
                @Override
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.hGetAll(keys.get(i++).getBytes());
                }
            });
  return results;
}

答案 2 :(得分:0)

您必须使用 stringRedisTemplate。 例如:

@Resource
private StringRedisTemplate stringRedisTemplate;

public List<Object> hgetpipeline(List<String> keys) {
    List<Object> results = stringRedisTemplate.executePipelined(
            new RedisCallback<Object>() {
                @Override
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
                    for(String key:keys) 
                    {
                        stringRedisConn.get(key);
                    }
                    return null;
                }
            });
  return results;
}