在过滤器中引入@Autowired注解的对象报空指针

翻车现场:在过滤器里要做一个刷新用户token时长的功能,引入redis操作对象时发生了报错,说这个bean对象是null。一般参数对象报空指针错误,倒是常见。但是方法对象报空指针错误第一次见,一时间没反应过来😂,其实说到底,他也是个bean对象。

问题原因:造成null的问题是因为拦截器、过滤器这些文件在加载的时候,是在springcontext创建之前完成的,没法直接通过@Autowired注解直接获取bean,所以在拦截器、过滤器中注入实体对象就会为null。

解决方法:通过spring上下文来获取IOC管理的实体类

public class AccessDeniedFilter {

    @Autowired
    private IRedisOperateDAO iRedisOperateDAO;

    //十分钟
    private static final Long MINUTES_10 = 10 * 60 * 1000L;


    /**
     * 校验时间
     * 过期时间与当前时间对比,临近过期10分钟内的话,自动刷新缓存
     *
     * @param loginUser
     * @return
     */
    private void checkLoginTime(LoginUserDto loginUser) {
        long expireTime = loginUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MINUTES_10) {
            loginUser.setLoginTime(System.currentTimeMillis());
            loginUser.setExpireTime(loginUser.getLoginTime() + 120 * 60 * 1000);

            if(null==iRedisOperateDAO){
                iRedisOperateDAO = SpringBeanFactoryUtils.getBean(IRedisOperateDAO.class);
            }
            //将需要的登入信息存至redis中
            String Sign = "zjmjToken:token-" + loginUser.getToken();
            iRedisOperateDAO.set(Sign, FastJsonUtil.toJSONString(loginUser),120*60);
        }
    }

}

spring上下文获取bean

/**
 * bean未加载前获取bean
 */
@Component
public class SpringBeanFactoryUtils implements ApplicationContextAware {
    private static ApplicationContext context = null;

    //获取bean
    public static <T> T getBean(Class<T> type) {
        return context.getBean(type);
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringBeanFactoryUtils.context == null) {
            SpringBeanFactoryUtils.context = applicationContext;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值