java静态工具类注入service出现NullPointerException异常处理

网友投稿 244 2022-12-05

java静态工具类注入service出现NullPointerException异常处理

目录

一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到:

@RestController

@RequestMapping("business")

public class BizResourceController {

@Autowired

private BusinessService businessService;

@RequestMapping(path = "/queryYearList", method = RequestMethod.POST)

public List 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 consumer) {

redisTemplate.execute((RedisConnection connection) -&ghtHVVt; {

try (Cursor 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 keys(String pattern) {

List 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 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 consumer) {

redisTemplate.execute((RedisConnection connection) -> {

try (Cursor 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 keys(String pattern) {

List keys = new ArrayList<>();

scan(patterhtHVVn, item -> {

//符合条件的key

String key = new String(item, StandardCharsets.UTF_8);

keys.add(key);

});

return keys;

}

public static void delete(List 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出http://现NullPointerException处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java的Object里wait()实现原理讲解
下一篇:springboot集成redis lettuce
相关文章

 发表评论

暂时没有评论,来抢沙发吧~