首頁 > 軟體

java靜態工具類注入service出現NullPointerException例外處理

2021-09-27 13:03:34

一般我們在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方式進行注入即可。

到此這篇關於java靜態工具類注入service出現NullPointerException例外處理的文章就介紹到這了,更多相關java靜態類注入service出現NullPointerException處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com