龙空技术网

java在静态工具类中注入service出现NullPointerException异常

java小悠 862

前言:

此时同学们对“netcore service为null”可能比较关注,我们都需要了解一些“netcore service为null”的相关内容。那么小编同时在网络上汇集了一些对于“netcore service为null””的相关知识,希望我们能喜欢,同学们一起来了解一下吧!

一般我们在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。所以当我们需要有类似需求进行注入的时候要调整注入方式和写法,如下代码:

@Componentpublic 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方式进行注入即可。

作者:我是大明哥

链接:

标签: #netcore service为null