springboot拆箱redisTemplate可能会产生NullPointerException

问题描述

我在项目中使用springboot(2.3.1)和生菜

过滤器

@Slf4j
@WebFilter(filterName = "requestWrapperFilter",urlPatterns = {"/*"})
public class RequestWrapperFilter implements Filter {
    @Resource
    private RedisTemplate redisTemplate;
    
    @Override
    public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException {
    ...
                if (redisTemplate.hasKey(COMMON_HEAD_TOKEN_NAME + token)) {
                    redisTemplate.delete(COMMON_HEAD_TOKEN_NAME + token);
                }
    }
    ...
}

RedisConfig配置如下:

@Configuration
@Component
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String,Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

但是当我调用interface时,应用程序显示以下错误:

有警告:

Unboxing of 'redisTemplate.hasKey(COMMON_HEAD_TOKEN_NAME + token)' may produce 'NullPointerException' 
Unchecked call to 'hasKey(K)' as a member of raw type 'org.springframework.data.redis.core.RedisTemplate' 

我可以忽略吗?

解决方法

第一个警告意味着hasKey方法返回一个对象包装器,但是在if条件中使用该对象包装器将其隐式取消装箱(即,将调用结果转换为原始值)。如果出于某种原因,hasKey方法返回null,您将收到错误消息。为了安全起见,请检查密钥的存在,如下所示:

if (Boolean.TRUE.equals(redisTemplate.hasKey(COMMON_HEAD_TOKEN_NAME + token))) {

第二个警告意味着您的redisTemplate字段具有原始类型,但是RedisTemplate类已参数化。要消除该警告,请在过滤器中定义redisTemplate字段,如下所示:

@Resource
private RedisTemplate<String,Serializable> redisTemplate;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...