java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理
一般我們在controller
層調(diào)用service
時,只需要使用@Autowired
注解即可,例如如下代碼我們經(jīng)??吹剑?/strong>
@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
中注入業(yè)務(wù)層類(BusinessService
)調(diào)用業(yè)務(wù)層方法queryYearList
。但是如果我們要在我們自己封裝的Utils工具類中或者非controller
普通類中使用@Autowired
注解注入Service
或者Mapper
接口,直接注入是報錯的,因為Utils
使用了靜態(tài)的方法,我們是無法直接使用非靜態(tài)接口的,當我們遇到這樣的問題,我們就要想辦法解決了。例如:
public class RedisHelper { private static final Logger logger = LoggerFactory.getLogger(RedisHelper.class); @Autowired private static StringRedisTemplate redisTemplate; /** * scan 實現(xiàn) * * @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結(jié)果:{}",delete1); } catch (Exception e) { e.printStackTrace(); } } }
如上代碼在redis
工具類中想要注入StringRedisTemplate
但是我們使用的時候會發(fā)現(xiàn),這個StringRedisTemplate
對象時null。所以當我們需要有類似需求進行注入的時候要調(diào)整注入方式和寫法,如下代碼:
@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 實現(xiàn) * * @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結(jié)果:{}",delete1); } catch (Exception e) { e.printStackTrace(); } } }
其修改的核心是:
首先加@Component
注解目的是讓spring
托管,另外注入StringRedisTemplate
我們采用set方式進行注入即可。
到此這篇關(guān)于java靜態(tài)工具類注入service出現(xiàn)NullPointerException
異常處理的文章就介紹到這了,更多相關(guān)java靜態(tài)類注入service
出現(xiàn)NullPointerException
處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在springboot中如何使用filter設(shè)置要排除的URL
這篇文章主要介紹了在springboot中如何使用filter設(shè)置要排除的URL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java 實現(xiàn)倒計時功能(由秒計算天、小時、分鐘、秒)
最近做項目遇到這樣的需求,天、小時、分鐘、秒的數(shù)值都是隔開的,服務(wù)器端只返回一個時間戳長度,怎么實現(xiàn)這樣的功能呢?下面小編給大家?guī)砹薐ava 實現(xiàn)倒計時功能的方案,需要的朋友參考下吧2018-01-01Java Validation Api如何實現(xiàn)自定義注解
這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09java安全?ysoserial?CommonsCollections1示例解析
這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Java springboot Mongodb增刪改查代碼實例
這篇文章主要介紹了Java springboot Mongodb增刪改查代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07