@autowired注入的对象正常,而new的对象为空指针

文章讨论了在SpringBoot测试类中使用@Autowired注入RedisTemplate时遇到的NullPointerException,原因是自定义类未受Spring管理。解决办法是确保所有依赖由Spring管理或在new时避免使用@Autowired的成员变量。
摘要由CSDN通过智能技术生成

问题背景

在学习redis时,需要在测试类中创建一个自己的redis工具类。

问题重现

@SpringBootTest
public class redisTest {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    void test() {
        RedisUtiles redisUtiles1 = new RedisUtiles();
        Product product = redisUtiles1.getObject("product", Product.class);
        System.out.println(product);
    }
}

其中new了一个RedisUtiles对象

运行结果报错如下

java.lang.NullPointerException: Cannot invoke "org.springframework.data.redis.core.RedisTemplate.opsForValue()" because "this.redisTemplate" is null

意思为redisTemplate为空

@SpringBootTest
public class redisTest {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private RedisUtiles redisUtiles;

    @Test
    void test() {
        Product product = redisUtiles.getObject("product", Product.class);
        System.out.println(product);
    }
}

通过@Autowired创建的redisTemplate则能正常运行

RedisTemplate类

@Component
public class RedisUtiles {
    public RedisUtiles() {
        System.out.println("空参构造");
    }

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    final  Integer defaultTTL = 30;
    final  TimeUnit defaltTimeUnit = TimeUnit.MINUTES;

    public <T> void setObject(String key, T value) {
        redisTemplate.opsForValue().set(key, JSON.toJSONString(value), defaultTTL, defaltTimeUnit);
    }

    public <T> void setObject(String key, T value, final Integer TTL, final TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, JSON.toJSONString(value), TTL, timeUnit);
    }

    public <T> T getObject(String key, Class<T> tClass) {
        String jsonString = redisTemplate.opsForValue().get(key);
        return JSON.parseObject(jsonString, tClass);
    }
}

原因分析

RedisUtiles类中通过@Autowired注入了RedisTemplate,该操作是通过spring实现的注入。而new出来的类不受spring管理,RedisUtiles中的RedisTemplate无法完成注入,因此为空。

解决方法

统一都用Spring管理,或在new时不使用类中通过spring注入的成员变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值