You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestTemplate为空致TokenValidationInterceptor空指针问题求助

问题解决:TokenValidationInterceptor中RestTemplate空指针异常

问题原因

你在AppConfig里直接new TokenValidationInterceptor()添加拦截器,这个实例不属于Spring容器管理的Bean,因此拦截器内部的restTemplate无法被自动注入,调用时触发空指针异常。

修复步骤

1. 改造TokenValidationInterceptor,实现RestTemplate正确注入

给拦截器添加RestTemplate字段,通过构造方法注入(符合Spring依赖注入最佳实践),代码如下:

import org.springframework.web.client.RestTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TokenValidationInterceptor implements HandlerInterceptor {

    private final RestTemplate restTemplate;

    // 构造方法注入RestTemplate
    public TokenValidationInterceptor(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        // 处理Authorization header的"Bearer "前缀
        String token = null;
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            token = authHeader.substring(7);
        }

        // token为空直接返回未授权
        if (token == null) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

        // 使用占位符拼接URL,避免字符串拼接的编码问题
        String verificationUrl = "http://localhost:8090/user/info?token={token}";
        ResponseEntity<Boolean> verificationResponse = restTemplate.getForEntity(verificationUrl, Boolean.class, token);

        if (verificationResponse.getStatusCode() == HttpStatus.OK && Boolean.TRUE.equals(verificationResponse.getBody())) {
            return true;
        } else {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
    }
}

2. 修改AppConfig,让拦截器被Spring容器管理

不再手动new拦截器,而是将其声明为Bean,通过Spring依赖注入提供实例,确保内部的RestTemplate被正确注入:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注入Spring管理的拦截器实例
        registry.addInterceptor(tokenValidationInterceptor(restTemplate()));
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    // 将拦截器声明为Spring Bean
    @Bean
    public TokenValidationInterceptor tokenValidationInterceptor(RestTemplate restTemplate) {
        return new TokenValidationInterceptor(restTemplate);
    }
}

额外优化建议

  • Token格式处理:原代码未处理Authorization头的Bearer 前缀,直接拼接会导致验证失败,现在已补充该逻辑。
  • URL参数安全:改用RestTemplate的占位符传递参数,避免直接字符串拼接带来的URL编码问题。
  • 空值提前拦截:增加token为空的判断,提前返回未授权状态,减少无效请求。

内容的提问来源于stack exchange,提问作者Nouhaila Khaouti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:34:52