SpringBoot中添加拦截器,在拦截器中注入其他类的时候出现空指针异常解决办法

简介: SpringBoot中添加拦截器,在拦截器中注入其他类的时候出现空指针异常解决办法

拦截器代码

/**
 *
 * 记录用户轨迹
 */
@Component
public class AdminInterceptor implements HandlerInterceptor {

    @Autowired
    SysLogDao sysLogDao

    /**
     * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
     */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了AdminInterceptor的afterCompletion方法");
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
        LocalDateTime now = LocalDateTime.now();
        Object user = request.getSession().getAttribute("userName");
        Object msg = request.getSession().getAttribute("msg");
        if (user != null && msg != null) {
            SysLog sysLog = new SysLog();
            sysLog.setLogId(IDUtils.getId());
            sysLog.setUserName(user.toString());
            sysLog.setMsg(msg.toString());
            sysLog.setCreateTime(dateTimeFormatter.format(now));
            SysLog save = sysLogDao.save(sysLog);
        }

    }
}

注入拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //静态资源:*.css  *.js
        //Spring Boot 已经做好了静态资源映射
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new AdminInterceptor());
        interceptorRegistration.addPathPatterns("/**").excludePathPatterns("/","/login");
    }
}

调用接口时发现,SysLogDao 并没有被注入进来!明明代码写的没问题,为什么不能正常注入SysLogDao 呢?

仔细观察我们自定义的配置类WebConfig ,在添加拦截器的时候用的是new AdminInterceptor(),如果想要拦截器生效,必须将拦截器配置到WebMvc的配置类中,就是我们自定义的WebConfig 类。现在添加拦截器的时候是 new 了一个拦截器,也就是说并没有将拦截器托管给IOC容器,拦截器加载是在springcontext创建之前完成的,所以就无法引入Spring的bean对象。

解决办法:让Bean对象提前加载,将拦截器注入进来。
方式一:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    public AdminInterceptor adminInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //静态资源:*.css  *.js
        //Spring Boot 已经做好了静态资源映射
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(adminInterceptor);
        interceptorRegistration.addPathPatterns("/**").excludePathPatterns("/","/login");
    }
}

方式二:
拦截器无需增加@Component注解,在WebConfiguration类中使用@Bean注解将拦截器注成bean。

/**
 *
 * 登录检查
 * 记录用户轨迹
 */
public class AdminInterceptor implements HandlerInterceptor {
...
}
@Configuration
public class WebConfig implements WebMvcConfigurer {

     @Bean
    public AdminInterceptor adminInterceptor(){
        return new AdminInterceptor();
   }
  
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //静态资源:*.css  *.js
        //Spring Boot 已经做好了静态资源映射
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(adminInterceptor());
        interceptorRegistration.addPathPatterns("/**").excludePathPatterns("/","/login");
    }
}
目录
相关文章
|
12天前
|
Java
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
13 4
|
10天前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
26 1
|
1月前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
1月前
|
JSON 缓存 前端开发
SpringBoot的 ResponseEntity类讲解(具体讲解返回给前端的一些事情)
本文讲解了SpringBoot中的`ResponseEntity`类,展示了如何使用它来自定义HTTP响应,包括状态码、响应头和响应体,以及如何将图片从MinIO读取并返回给前端。
57 3
|
1月前
|
Java Spring 容器
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
这篇文章讨论了在Spring Boot 3.2.1版本中,同名同类型的bean和@Service注解类之间冲突的问题得到了解决,之前版本中同名bean会相互覆盖,但不会在启动时报错,而在配置文件中设置`spring.main.allow-bean-definition-overriding=true`可以解决这个问题。
83 0
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
|
1月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
143 1
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2