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

目录

一般我们在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处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java异常:异常处理--try-catch结构详解

    目录 总结 从键盘接收两个整数,输出两数的商: package java_exception; import java.util.Scanner; public class TryDemoOne { public static void main(String[] args) { //定义两个整数,键盘输入两个整数,输出两数之商 Scanner input = new Scanner(System.in); System.out.println("=====运算开始====="); S

  • java:try...catch跳过异常继续处理循环问题

    目录 问题描述 解决方案很简单 1.捕获异常继续执行代码 2.说明 java处理异常try catch 的快捷键 问题描述 在代码循环体中,抛出异常后代码会停止执行,导致代码不能完整运行. 解决方案很简单 捕获异常并简单处理一下就可以. 1.捕获异常继续执行代码 只贴核心样例代码 public void getTest() { List<String> list = new ArrayList<>(); list.add("1"); list.add("

  • Java异常类型及处理详情

    目录 一.异常处理的关键字 1.throw 2.throws 异常结构为: Throwable 为顶级父类 子类Error为严重报错 , 子类Exception就是我们所说的异常了 一.异常处理的关键字 java中处理异常的有五个关键字: try.catch .finally . throw .throws throw抛出异常 , thorws声明异常 , 捕获异常 try_catch 1.throw public class SegmentFault { public static void

  • Java异常的处理机制

    图片解析: 1.生成字节码文件的过程可能产生编译时异常(checked),由字节码文件到在内存中加载.运行类此过程可能产生运行时异常(unchecked), 2.JAVA程序在执行过程中所发生的异常事件可分为两类: > Error: Java虚拟机无法解决的的严重问题.如:JVM系统内部错误.资源耗尽等严重情况.比如:StackOverflowError和OOM.一般不编写针对性的代码进行处理. > Exception: 其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行

  • Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    Spring3.0 对异常的处理方式总共有两种: 一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExceptionResolver. 第二种方法是在 Controller 内部实现,灵活性更高. 从目前的调查结果来看,这两种方式不能共存.我们一般在项目中使用第一种方法. 下面分别描述一下这两种使用方式: 一.基于 HandlerExceptionResolver 接口的方式 使用这种方式只需要实现 reso

  • Java 基础语法 异常处理

    目录 1. 异常的背景 1.1 邂逅异常 1.2 异常和错误 1.3 Java 异常的体系(含体系图) 1.4 异常的核心思想 1.5 异常的好处 2. 异常的基本用法 2.1 捕获异常 2.1.1 基本语法 2.1.2 示例一 2.1.3 示例二(含使用调用栈) 2.1.4 示例三(可以使用多个 catch 捕获不同的异常) 2.1.5 示例四(可以使用一个 catch 捕获所有异常,不推荐) 2.1.6 示例五(使用 finally,它之间的代码将在 try 语句后执行) 2.1.7 示例六

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

    目录 一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到: @RestController @RequestMapping("business") public class BizResourceController { @Autowired private BusinessService businessService; @RequestMapping(path = "/queryYearList"

  • Java实现普通类注入service对象

    普通类注入service对象 找了很多办法,无论是加@Component还是编写工具类实现ApplicationContextAware,始终为null. 最后使用这两行代码解决: WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); DailySurveyService service = (DailySurveyService) context.getBean("dailySurvey

  • 解决SpringMvc中普通类注入Service为null的问题

    SpringMvc中普通类注入Service为null 场景: 使用Quartz定时器时,普通的java类需要注入spring的service类,在调用时报错! 解决方式: /** * 定时获取课程的service */ @Autowired protected QuartzGetCourseService quartzGetCourseService = (QuartzGetCourseService) SpringContextUtil .getBean("quartzGetCourseSe

  • java分页工具类的使用方法

    说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的.现在好了,经本人总结与提炼: 无论你是否自己手动分页,还是借助了框架进行分页.此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下: package test.dao; import java.util.List; /** * 用于分页的工具类 * @a

  • Java Arrays工具类用法详解

    本文实例讲述了Java Arrays工具类用法.分享给大家供大家参考,具体如下: Arrays类 功能描述 Arrays类是一个工具类,其中包含了数组操作的很多方法,比如搜索和排序: Arrays类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法. 几个重要方法   1.asList(T... a) 由给定的数组a,返回一个固定大小的List对象.在这里,着重解释一下前面这句话的深层含义,我们可以看Arrays类的源码,来帮助我们理解. 生成的List对象

  • springboot如何读取配置文件到静态工具类

    目录 springboot读取配置文件到静态工具类 我们可以用Environment 来解决 将配置文件的值加载到工具类的静态变量中(多环境运行加载) 首先创建一个SpringBoot项目 创建配置文件 创建实体类 springboot读取配置文件到静态工具类 通常我们读取配置文件可以用@Value注解和@Configuration,@ConfigurationProperties(prefix = "xxx")等注解,但是这种方式是无法把配置读取到静态变量的,如果我们想在项目初始化时

  • Java时间工具类Date的常用处理方法

    目录 前言 Date 类 构造方法 常用方法 前言 Date 类 Date 类表示系统特定的时间戳,可以精确到毫秒.Date 对象表示时间的默认顺序是星期.月.日.小时.分.秒.年. 构造方法 Date 类有如下两个构造方法. Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间. Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0

  • java Arrays工具类实例详解

    Arrays工具类属于java中常用的工具类 public static void sort(int[] a) public static void sort(int[] a,int fromIndex, int toIndex) public static void sort(long[] a) public static void sort(long[] a,int fromIndex, int toIndex) public static void sort(short[] a) publ

  • 详解Java常用工具类—泛型

    一.泛型概述 1.背景 在Java中增加泛型之前,泛型程序设计使用继承来实现的. 坏处: 需要进行强制类型转换 可向集合中添加任意类型的对象,存在风险 2.泛型的使用 List<String> list=new ArrayList<String>(); 3.多态与泛型 class Animal{} class Cat extends Animal{} List<Animal> list=new ArrayList<Cat>(); //这是不允许的,变量声明的

  • java常用工具类 数字工具类

    本文实例为大家分享了java常用工具类,数字工具类的具体代码,供大家参考,具体内容如下 package com.jarvis.base.util; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Random; public class NumericHelper { /** * 描述:通过一个整数i获取你所要的哪几个(从0开始

随机推荐