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


猜你喜欢
- 一、下载客户端代码package javadownload; import java.io.ByteArrayOutputStream; i
- 在实际开发中,我们经常会需要在页面跳转的时候携带路由参数,典型的例子就是从列表到详情页的时候,需要携带详情的 id,以便详情页获取对应的数据
- this在Java中,this的作用和其词义很接近。它在方法内部使用,即这个方法所属对象的引用;它在构造器内部使用,表示该构造器正在初始化的
- 我们在java中处理字符串的时候,一般会选择String,在python中同样也是作用于字符串。那么我们今天延伸一下它的用法,只使用Stri
- mybatis 映射文件中,if标签判断字符串相等,两种方式:因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量
- 本文实例为大家分享了Android实现定时器和倒计时的具体代码,供大家参考,具体内容如下直接上代码,相信都看得懂。Android已经帮封装好
- 代码如果不进行格式化的处理,那么在查阅上会浪费不少的时间。今天我们要说的是字符串的格式化处理,作为基础编程内容,相信大家都字符串都不陌生。我
- Android本身已经提供了ProgressDialog进度等待框,使用该Dialog,我们可以为用户提供更好的体验:在网络请求时,弹出此框
- 本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。读者可以拉
- 点击此处:官网下载 根据自己的系统 ,下载相应的JDK版本。1. JDK1.8安装1.双击下载的安装包(.exe文件),进行安装。2.点击“
- 你平时是怎么读取文件的?使用流读取。是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和
- 近来关于 Kotlin 的文章着实不少,Google 官方的支持让越来越多的开发者开始关注 Kotlin。不久前加入的项目用的是 Kotli
- 前言: 项目有个音乐播发器功能,实现音乐在线播放,同时需要带有歌词显示功能。网上也找过,在github找到勉强能用的控件,只是效果还是差强人
- 本文实例讲述了C#实现的字符串转MD5码函数。分享给大家供大家参考,具体如下:/*测试环境:WinXP SP3、Visual Studio
- 指针是什么?指针(Pointer)是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。换句话说就是可以通过指针找到以它为地址的内存
- springboot默认读取的配置文件名字是:“application.properties”和&a
- Swing 程序用JFrame 对象实现了它们的窗口。JFrame 类是AWT Frame 类的一个子类。它还加入了一些Swing 所独有的
- @Autowired注入依赖失败的问题1、现象描述在Spring Boot项目中使用@Autowired注解,程序启动时发现服务启动失败,提
- Java 8来了,是时候学一下新的东西了。Java 7和Java 6只不过是稍作修改的版本,而Java 8将会发生重大的改进。或许是Java
- 一、连接客户端原理流程图二、功能要求1)连接成功后,可以将服务器发来的消息不停地显示在 listbox 中;2) 客户端要发给服务器的数据,