Spring @Autowired註解在非Controller中注入為null
阿新 • • 發佈:2019-01-10
前言
好久沒寫部落格了,不知不覺大學已經過去兩年了。 時光快似箭,光陰似如梭, 小學時的打油詩, 逃:)
話說回來,今天在寫一個工具類,裡面用了@Autowired
注入了TokenRepository
以及TokenService
時,在TokenRepository
的findFirstById()
方法一直報 java.lang.nullpointerexception
異常,一開始以為是傳進去的id有問題,後來除錯發現穿進去的id是有資料的,一擡頭看到 tokenRepository
為null, !!!∑(゚Д゚ノ)ノ 什麼鬼!
可能的原因: 網上百度了很久,原因可能在於我的utils包的類和controller的類不是同一個上下文。
解決辦法
通過新增以下三個關鍵的地方,可以解決該問題
關於@PostConstruct:被@PostConstruct修飾的方法會在伺服器載入Servlet的時候執行,並且只會被伺服器呼叫一次,類似於Serclet的inti()方法。被@PostConstruct修飾的方法會在建構函式之後,init()方法之前執行。
/**
* Created by huangzhenyang on 2017/11/2.
* Token 工具類
*/
@Component // 關鍵1,將該工具類註冊為元件, 加粗!!!
public class TokenUtil {
@Autowired
private TokenRepository tokenRepository;
@Autowired
private TokenService tokenService;
private static SimpleDateFormat df =
new SimpleDateFormat("yyyy-MM-dd");//設定日期格式
private int dueTime = 86400000;
public static TokenUtil tokenUtil; // 關鍵2
public TokenUtil() {
}
// 關鍵3
@PostConstruct
public void init() {
tokenUtil = this;
tokenUtil.tokenRepository = this.tokenRepository;
}
………………
這樣一來,就能在TokenUtils
工具類中,通過tokenUtil.tokenRepository
來呼叫相關的spring data jpa的函式:
可以看到這樣改完以後,tokenUtil.tokenRepository
不是null
寫在後面
感覺對spring boot 還有好多不懂的,學的也不是太深入;最近由於時間緊就只能淺嘗輒止了= = 日後填坑