springboot redis模板的开箱。可能会产生 NullPointerException
springboot Unboxing of redisTemplate. may produce NullPointerException
我在项目中使用springboot(2.3.1)和Lettuce
过滤器
@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;
}
}
但是当我调用接口时,应用程序显示以下错误:
有警告:
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
方法 returns 是一个对象包装器,但是在 if
条件中使用它会隐式地取消装箱(即将调用的结果转换为原始值)。如果由于某种原因 hasKey
方法 returns null
,你会得到一个错误。为了安全起见,请按如下方式检查密钥是否存在:
if (Boolean.TRUE.equals(redisTemplate.hasKey(COMMON_HEAD_TOKEN_NAME + token))) {
第二个警告意味着您的 redisTemplate
字段具有原始类型,但是 RedisTemplate
class 是参数化的。要消除警告,请按如下方式在过滤器中定义 redisTemplate
字段:
@Resource
private RedisTemplate<String, Serializable> redisTemplate;
我在项目中使用springboot(2.3.1)和Lettuce
过滤器
@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;
}
}
但是当我调用接口时,应用程序显示以下错误:
有警告:
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
方法 returns 是一个对象包装器,但是在 if
条件中使用它会隐式地取消装箱(即将调用的结果转换为原始值)。如果由于某种原因 hasKey
方法 returns null
,你会得到一个错误。为了安全起见,请按如下方式检查密钥是否存在:
if (Boolean.TRUE.equals(redisTemplate.hasKey(COMMON_HEAD_TOKEN_NAME + token))) {
第二个警告意味着您的 redisTemplate
字段具有原始类型,但是 RedisTemplate
class 是参数化的。要消除警告,请按如下方式在过滤器中定义 redisTemplate
字段:
@Resource
private RedisTemplate<String, Serializable> redisTemplate;