java静态工具类注入service出现NullPointerException异常处理
作者:我是大明哥 发布时间:2021-11-28 09:59:11
标签:java,service,NullPointerException
一般我们在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();
}
}
}
其修改的核心是:
首先加@Component
注解目的是让spring
托管,另外注入StringRedisTemplate
我们采用set方式进行注入即可。
来源:https://juejin.cn/post/7011387262924095524
0
投稿
猜你喜欢
- 1、效果展示2、布局文件<?xml version="1.0" encoding="utf-8"
- 上篇文章中介绍了聊天功能,这里介绍通讯录是如何实现的。首先要加载公司的所有部门,树形结构,然后点击进入部门的人员列表,点击人员能查看详细信息
- 工厂方法模式动机创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展。而且,有
- SpringBoot找不到映射文件org.apache.ibatis.binding.BindingException: Invalid b
- Java 执行CMD命令或执行BAT批处理背景日常开发中总能遇到一些奇怪的需求,例如使用java执行cmd命令或者bat批处理文件,今天就简
- 本文所述为C#实现根据指定容器和控件名字获得控件的方法,在进行C#应用程序设计时有一定的借鉴价值。分享给大家供大家参考借鉴。具体实现方法如下
- 本文实例讲述了C#使用文件流读取文件的方法。分享给大家供大家参考。具体如下:using System;using System.IO;nam
- 定义与结构 备忘录(Memento)模式又称标记(Token)模式。GOF给备忘录模式的定义为:在不破坏
- 前言:各位小伙伴们,大家好,一日不见,如隔一日,今天我给大家分享一下大家在学习java过程当中遇到的一个问题,也是一道面试题,java中,O
- 继续我们的源码解析,上一篇文章我们介绍了Activity的启动流程,一个典型的场景就是Activity a 启动了一个Activity b,
- 创建类的对象 = 类的实例化 = 实例化类类和对象的使用(面向对象思想落地的实现):1.创建类,设计类的成员2.创建类的对象3.通过“对象.
- 这篇文章主要介绍了SpringBoot FreeWorker模板技术解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 一、安装JDK1.卸载旧版本或者系统自带的JDK(1)列出所有已安装的JDKrpm -qa | grep jdk(2)卸载不需要的JDKyu
- 谨记:Url表只储存受保护的资源,不在表里的资源说明不受保护,任何人都可以访问1、MyFilterInvocationSecurityMet
- 一、数组(Array)数组具有以下的特点:数组属于线性结构,在内存中是连续存放的。数组的元素类型必须相同。数组可以直接通过下标访问。数组的查
- 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式第一种表示方式(任何一个类都有一个隐含的静态成员变量class):Class
- Nacos简介Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队
- 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方
- 用户提出一个需求:当修改产品价格的时候,需要记录操作日志,什么时候做了什么事情。想必这个案例,只要是做过应用系统的小伙伴们,都应该遇到过吧?
- 项目中很多时候需要读取自定义配置文件,本地开发工具怎么写都成功但是部署到服务其上就出现问题,异常BOOT-INF/classes!/conf