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
相关产品推荐
相关产品推荐

