使用HandlerInterceptor 中注入其他service时为null分析及解决

博客分析了Java中UserInfoLoginService和SysUserService为null的原因,是因为拦截器加载在springcontext创建前,new ServerInterceptor()时未注入内部属性。给出的解决方案是在拦截器配置中提前暴露拦截器,交给spring容器管理,还可给拦截器添加@Component让容器管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一情况分析

1.1 拦截器代码

public class ServerInterceptor implements HandlerInterceptor {
    private static final Logger _logger = LoggerFactory.getLogger(ServerInterceptor.class);
    PrintWriter out;
    JSONObject res = new JSONObject();
    
    @Autowired
    UserInfoLoginService userInfoLoginService;
    @Autowired
    SysUserService sysUserService;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        _logger.info("ServerInterceptor逻辑处理");
        String header = request.getHeader("Server");
        if (!"Server".equals(header)) {
            _logger.info("ServerInterceptor无权限");
            res.put("code", "Server");
            res.put("msg", "ServerInterceptor无权限");
            res.put("data", null);
            out = response.getWriter();
            out.append(res.toString());
            return false;
        }
        return true;
    }

1.2 拦截器配置

在这里插入图片描述

1.3 原因

造成 UserInfoLoginService,SysUserService 为null的原因:
拦截器加载是在springcontext创建之前完成的,在拦截器配置进行加载,进行new ServerInterceptor()时,这里只是创建的ServerInterceptor空对象,并没有将内部属性进行注入;容器启动结束在使用拦截器时注入实体自然就为null。

二解决方案

在拦截器配置中将拦截器提前暴露,交给spring容器管理

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Resource
    InterceptorProperties interceptorProperties;

    @Resource
    ServerInterceptor serverInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {


        //注册ServerInterceptor
        InterceptorRegistration serverRegistration = registry.addInterceptor(serverInterceptor);

        if (!CollectionUtils.isEmpty(interceptorProperties.getIncludeFilterServerPaths())) {
            // Server拦截路径
           serverRegistration.addPathPatterns(interceptorProperties.getIncludeFilterServerPaths());
        }
       


    }
}

2、拦截器添加@Component,交给容器管理

@Component
public class ServerInterceptor implements HandlerInterceptor {
    private static final Logger _logger = LoggerFactory.getLogger(ServerInterceptor.class);
    PrintWriter out;
    JSONObject res = new JSONObject();

    @Autowired
    UserInfoLoginService userInfoLoginService;

    @Autowired
    SysUserService sysUserService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        _logger.info("ServerInterceptor逻辑处理");
        String header = request.getHeader("Server");
        if (!"Server".equals(header)) {
            _logger.info("ServerInterceptor无权限");
            res.put("code", "Server");
            res.put("msg", "ServerInterceptor无权限");
            res.put("data", null);
            out = response.getWriter();
            out.append(res.toString());
            return false;
        }
        return true;
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值