如果攔截器加載的時間點在Spring的上下文初始化之前,導致注入的值爲null,您可以嘗試以下兩種解決方法:
- 使用
@PostConstruct
註解:
在攔截器中使用@PostConstruct
註解標記一個初始化方法,在該方法中手動獲取配置值,並進行相應的處理。這樣可以確保在攔截器初始化完成後,配置值已經被正確加載。例如:
@Component
public class TokenInterceptor implements HandlerInterceptor {
@Value("${authorize.token}")
private String expectedToken;
private String cachedExpectedToken;
@PostConstruct
public void init() {
// 在初始化方法中獲取配置值並緩存
cachedExpectedToken = expectedToken;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 使用緩存的配置值進行處理
String token = request.getHeader("Authorization");
System.out.println("從header中獲取到token:" + token);
System.out.println("expectedToken:" + cachedExpectedToken);
if (token != null && token.equals(cachedExpectedToken)) {
return true;
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("無權限訪問");
return false;
}
}
// 省略其他方法
}
- 自定義屬性讀取類:
創建一個自定義的屬性讀取類,在該類中手動讀取配置文件中的屬性值,並在攔截器中使用該屬性讀取類獲取配置值。這樣可以確保配置值在攔截器初始化之前已經被正確加載。例如:
@Component
public class TokenProperties {
@Value("${authorize.token}")
private String expectedToken;
public String getExpectedToken() {
return expectedToken;
}
}
@Component
public class TokenInterceptor implements HandlerInterceptor {
private final TokenProperties tokenProperties;
@Autowired
public TokenInterceptor(TokenProperties tokenProperties) {
this.tokenProperties = tokenProperties;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 使用屬性讀取類獲取配置值進行處理
String token = request.getHeader("Authorization");
System.out.println("從header中獲取到token:" + token);
System.out.println("expectedToken:" + tokenProperties.getExpectedToken());
if (token != null && token.equals(tokenProperties.getExpectedToken())) {
return true;
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("無權限訪問");
return false;
}
}
// 省略其他方法
}