学习Java第n天&&掉头发第n天 2024-03-11 15:57 采纳率: 87%
浏览 11

spring 项目,在过滤器和拦截器中同时装配同一个对象,为什么拦截器装配的对象为 null 呢

项目中,之前只在过滤器装配了一个 mapper 对象,可以正常使用,由于项目变化,需要在拦截器中添加同一个 mapper 对象, 可是在拦截器中报空指针了,这是为什么?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-11 15:58
    关注

    引自免费微信小程序:皆我百晓生

    在Spring项目中,过滤器(Filter)和拦截器(Interceptor)都是在容器初始化时创建的,它们都可以通过依赖注入来获取所需的Bean对象。但如果你发现拦截器中的同一个mapper对象为null,可能的原因有以下几点:

    1. 生命周期问题:拦截器的初始化顺序可能晚于Spring容器中bean的初始化。确保你的拦截器是在Spring管理下的,并且正确地通过@Autowired或其他方式进行了依赖注入。
    @Component
    public class YourInterceptor implements HandlerInterceptor {
        @Autowired
        private YourMapper yourMapper; // 确保yourMapper在这里被正确注入
    
        // ... 其他代码
    }
    
    1. 配置问题:请检查是否正确配置了拦截器,并将其添加到Spring MVC的拦截器链中,例如在WebMvcConfigurerAdapter或WebMvcConfigurer实现类中:
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Autowired
        private YourInterceptor yourInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(yourInterceptor);
        }
    }
    
    1. 作用域问题:如果mapper bean是request或session作用域的,在过滤器中可以访问,但在拦截器中由于请求上下文不同可能导致无法获取。确认mapper bean的作用域为singleton。

    2. 代理问题:如果你的mapper接口是通过MyBatis或其他框架动态生成的代理对象,需要确保拦截器能够正确识别并注入代理对象,而不是原始接口。

    3. 手动创建实例:如果你不是通过Spring容器来创建拦截器实例,而是直接new出来,那么Spring自然无法对其中的成员变量进行自动装配,应改为从Spring容器中获取。

    排查以上情况后,通常就能解决拦截器中mapper对象为空的问题。如果上述方法都不能解决问题,请进一步提供具体的代码配置和错误堆栈信息以便分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月11日
  • 创建了问题 3月11日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22