java静态工具类注入service出现NullPointerException异常处理

作者:我是大明哥 时间:2021-11-28 09:59:11 

一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到:


@RestController
@RequestMapping("business")
public class BizResourceController {
   @Autowired
   private BusinessService businessService;
   @RequestMapping(path = "/queryYearList", method = RequestMethod.POST)
   public List<String> queryYearList(@RequestParam("cityCode") String cityCode) {
       return businessService.queryYearList(cityCode);
   }
}

以上代码的含义就是通过在controller中注入业务层类(BusinessService)调用业务层方法queryYearList。但是如果我们要在我们自己封装的Utils工具类中或者非controller普通类中使用@Autowired注解注入Service或者Mapper接口,直接注入是报错的,因为Utils使用了静态的方法,我们是无法直接使用非静态接口的,当我们遇到这样的问题,我们就要想办法解决了。例如:


public class RedisHelper {
   private static final Logger logger = LoggerFactory.getLogger(RedisHelper.class);
   @Autowired
   private static StringRedisTemplate redisTemplate;

/**
    * scan 实现
    *
    * @param pattern  表达式
    * @param consumer 对迭代到的key进行操作
    */
   public static void scan(String pattern, Consumer<byte[]> consumer) {
       redisTemplate.execute((RedisConnection connection) -> {
           try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(pattern).build())) {
               cursor.forEachRemaining(consumer);
               return null;
           } catch (IOException e) {
               e.printStackTrace();
               throw new RuntimeException(e);
           }
       });
   }

/**
    * 获取符合条件的key
    *
    * @param pattern 表达式
    * @return
    */
   public static List<String> keys(String pattern) {
       List<String> keys = new ArrayList<>();
       scan(pattern, item -> {
           //符合条件的key
           String key = new String(item, StandardCharsets.UTF_8);
           keys.add(key);
       });
       return keys;
   }

public static void delete(List<String> listKey) {
       try {
           logger.info("需要删除key:" + listKey);
           Long delete1 = redisTemplate.delete(listKey);
           logger.info("清除redis-key结果:{}",delete1);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

}

如上代码在redis工具类中想要注入StringRedisTemplate但是我们使用的时候会发现,这个StringRedisTemplate对象时null。所以当我们需要有类似需求进行注入的时候要调整注入方式和写法,如下代码:


@Component
public class RedisHelper {
   private static final Logger logger = LoggerFactory.getLogger(RedisHelper.class);
   private static StringRedisTemplate redisTemplate;

@Autowired
   public void setRedisTemplate(StringRedisTemplate redisTemplate) {
       RedisHelper.redisTemplate = redisTemplate;
   }

/**
    * scan 实现
    *
    * @param pattern  表达式
    * @param consumer 对迭代到的key进行操作
    */
   public static void scan(String pattern, Consumer<byte[]> consumer) {
       redisTemplate.execute((RedisConnection connection) -> {
           try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(pattern).build())) {
               cursor.forEachRemaining(consumer);
               return null;
           } catch (IOException e) {
               e.printStackTrace();
               throw new RuntimeException(e);
           }
       });
   }

/**
    * 获取符合条件的key
    *
    * @param pattern 表达式
    * @return
    */
   public static List<String> keys(String pattern) {
       List<String> keys = new ArrayList<>();
       scan(pattern, item -> {
           //符合条件的key
           String key = new String(item, StandardCharsets.UTF_8);
           keys.add(key);
       });
       return keys;
   }

public static void delete(List<String> listKey) {
       try {
           logger.info("需要删除key:" + listKey);
           Long delete1 = redisTemplate.delete(listKey);
           logger.info("清除redis-key结果:{}",delete1);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

其修改的核心是:

java静态工具类注入service出现NullPointerException异常处理

首先加@Component注解目的是让spring托管,另外注入StringRedisTemplate我们采用set方式进行注入即可。

来源:https://juejin.cn/post/7011387262924095524

标签:java,service,NullPointerException
0
投稿

猜你喜欢

  • C#中异步和多线程的区别介绍

    2021-08-23 07:06:49
  • java反射之通过反射了解集合泛型的本质(详解)

    2023-02-04 03:10:25
  • Java Spring开发环境搭建及简单入门示例教程

    2021-08-17 07:36:28
  • 关于@Autowired注入依赖失败的问题及解决

    2023-11-29 00:50:42
  • Java NIO框架Netty简单使用的示例

    2022-09-08 02:51:27
  • 初识MyBatis及基本配置和执行

    2021-11-12 05:53:40
  • 详解SpringBoot修改启动端口server.port的四种方式

    2022-03-10 20:28:48
  • String concat(String str)使用小结

    2023-02-28 05:52:13
  • Java基础学习之构造方法详解

    2021-06-16 16:25:53
  • 一文带你彻底理解Java序列化和反序列化

    2021-12-23 05:24:12
  • mybatis查询语句揭秘之参数解析

    2021-07-10 01:17:18
  • c# Linq distinct不会调用Equals方法详解

    2021-09-03 09:53:13
  • 浅析Java类和数据结构中常用的方法

    2022-03-03 19:39:53
  • 解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    2021-08-06 20:52:42
  • Java matches类,Pattern类及matcher类用法示例

    2022-02-21 22:39:52
  • OpenCV Java实现人脸识别和裁剪功能

    2022-08-21 01:47:23
  • Java使用openOffice对于word的转换及遇到的问题解决

    2021-12-03 00:01:16
  • android中使用SharedPreferences进行数据存储的操作方法

    2023-06-16 17:37:42
  • Java Bean Validation使用示例详解

    2023-07-19 07:05:26
  • springcloud项目占用内存好几个G导致服务器崩溃的问题

    2023-03-30 09:54:25
  • asp之家 软件编程 m.aspxhome.com