RedisCache 类中的 NullPointerException(行号 614).版本 1.8.22



有时 NullPointerException 发生在 RedisCache 类中(行号 614(。版本 1.8.22

春季引导版本:1.5.21.发布

红地思配置:

@Bean(name = "stringJdkTransactionalRedisTemplate")
public RedisTemplate getRedisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setDefaultSerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
@Bean
public LettuceConnectionFactory connectionFactory() {
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
connectionFactory.setHostName(redisHost);
connectionFactory.setPort(redisPort);
connectionFactory.setPassword(redisPassword);
return connectionFactory;
}

执行代码

public void method1() {
SecurityContext securityContext = SecurityContextHolder.getContext();
User contextUser = ((CustomUser)securityContext.getAuthentication().getPrincipal()).getCustomUser();
contextUser.setRegistrationStatus(clientRegistrationStatus);
redisTemplate.opsForHash().put("spring:session:sessions:" + sessionId, "sessionAttr:SPRING_SECURITY_CONTEXT", securityContext);
method2(user);
}
@Transactional
@CacheEvict(value = CacheName.USER_CACHE, key = "'getByEmail.' + #user.email")
public User methood2(@NotNull User user) {
return userRepository.saveAndFlush(user);
}

有时此代码在方法的最后一行引发以下异常1

java.lang.NullPointerException: nulljava.lang.NullPointerException: null at
org.springframework.data.redis.cache.RedisCache$AbstractRedisCacheCallback.waitForLock(RedisCache.java:614) at
org.springframework.data.redis.cache.RedisCache$AbstractRedisCacheCallback.doInRedis(RedisCache.java:577) at
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:207) at
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169) at
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:157) at
org.springframework.data.redis.cache.RedisCache.evict(RedisCache.java:280) at
org.springframework.data.redis.cache.RedisCache.evict(RedisCache.java:269) at org.springframework.cache.interceptor.AbstractCacheInvoker.doEvict(AbstractCacheInvoker.java:98) at
org.springframework.cache.interceptor.CacheAspectSupport.performCacheEvict(CacheAspectSupport.java:476) at
org.springframework.cache.interceptor.CacheAspectSupport.processCacheEvicts(CacheAspectSupport.java:459) at
org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:417) at
org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:323) at
org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61) at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671) at
UserServiceImpl$$EnhancerBySpringCGLIB$$7d5a15d5.method2(<generated>) at
ClientServiceImpl.method1(ClientServiceImpl.java:248)

事实上,问题出在"事务"流中。 这里有两个选择:从 bean 配置中删除 "redisTemplate.setEnableTransactionSupport(true(",或者将 method2(( 从任何事务范围移出。

最新更新