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");
    }
}
目录
相关文章
|
19天前
|
前端开发 Java 程序员
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
|
24天前
|
Java 容器
自定义数据类型中的空指针异常
自定义数据类型中的空指针异常
8 2
|
1月前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
44 1
探索Java开发中触发空指针异常的场景
|
11天前
|
XML Java 数据格式
java异常-SpringBoot-
java异常-SpringBoot-
7 0
|
1月前
|
Java Spring 容器
SpringBoot 使用Quartz执行定时任务对象时无法注入Bean问题
SpringBoot 使用Quartz执行定时任务对象时无法注入Bean问题
43 1
|
1月前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
32 1
|
1月前
|
Oracle 安全 Java
Seata常见问题之启动seata一直报空指针异常如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
1月前
|
安全 Java
Springboot2.1.1版本升级到2.3.10版本报错合集及解决办法
Springboot2.1.1版本升级到2.3.10版本报错合集及解决办法
|
1月前
|
SQL Java 调度
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
|
1月前
|
Java
SpringBoot全局异常@RestControllerAdvice全局异常
SpringBoot全局异常@RestControllerAdvice全局异常
16 0