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();
}
}
}
其修改的核心是:
首先加@Component
注解目的是让spring
托管,另外注入StringRedisTemplate
我们采用set方式进行注入即可。
来源:https://juejin.cn/post/7011387262924095524
标签:java,service,NullPointerException
0
投稿
猜你喜欢
VScode 打造完美java开发环境最新教程
2023-02-24 16:02:10
Fluent Mybatis让你摆脱Xml文件的技巧
2023-10-02 18:31:00
Spring Cache简单介绍和使用大全
2023-11-25 04:46:46
javafx实现五子棋游戏
2022-02-01 07:00:01
双重检查锁定模式Java中的陷阱案例
2023-11-13 22:11:02
SpringCloud分布式链路追踪组件Sleuth配置详解
2023-11-28 23:58:42
解决JTable排序问题的方法详解
2023-02-07 08:53:42
Android 中无法取消标题栏的问题小结(两种方法)
2021-06-25 19:45:02
浅谈JDK9的特性之JVM的xlog
2022-07-20 12:00:45
Kotlin协程Job生命周期结构化并发详解
2023-05-23 10:08:17
OKhttp拦截器实现实践环节源码解析
2023-04-27 05:00:21
关于java数组与字符串相互转换的问题
2021-08-08 18:50:31
Java集合的总体框架相关知识总结
2021-06-25 10:43:36
Android Studio和阿里云数据库实现一个远程聊天程序
2023-06-14 21:09:16
详解基于Spring Cloud几行配置完成单点登录开发
2023-07-06 19:14:11
详解netty中的frame解码器
2022-02-22 14:40:21
RN在Android打包发布App(详解)
2021-08-25 06:21:11
c# JSON返回格式的WEB SERVICE
2022-04-16 01:43:31
Android中volley封装实践记录
2021-07-05 19:55:03
MyBatis自定义类型转换器实现加解密
2023-09-10 20:18:00