解决NoSuchMethodError: org.springframework.data.redis.core.RedisTemplate.del的问题

330 阅读1分钟

在调用redisTemplate.delete出现了下面的异常

NoSuchMethodError: org.springframework.data.redis.core.RedisTemplate.delete(Ljava/lang/Object;)V

看了好几篇文章都说是版本重复的问题,但是版本确实没有重复,所以采用下面的方法进行解决:

/**
 * 释放分布式锁
 * @param lockKey 锁的key
 */
public synchronized boolean releaseLock(String lockKey,String lockValue) {
    if (redisTemplate == null) {
        return true;
    }
    try {
        if(redisTemplate.getKeySerializer() instanceof org.springframework.data.redis.serializer.StringRedisSerializer){
            String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                    "    return redis.call('del', KEYS[1]) " +
                    "else " +
                    "    return 0 " +
                    "end ";
            redisTemplate.execute((RedisCallback<Long>) connection -> connection.eval(luaScript.getBytes(), ReturnType.INTEGER, 1, lockKey.getBytes(), lockValue.getBytes()));
            return true;
        }else{
            redisTemplate.delete(lockKey);
            return true;
        }
    }catch (Exception e){
        logger.error("释放分布式锁失败,锁键值:"+ lockKey,e);
    }catch (Throwable e){
        logger.error("释放分布式锁失败,锁键值:"+ lockKey,e);
    }
    return false;
}