1. 程式人生 > >Spring @Autowired註解在非Controller中注入為null

Spring @Autowired註解在非Controller中注入為null

前言

好久沒寫部落格了,不知不覺大學已經過去兩年了。 時光快似箭,光陰似如梭, 小學時的打油詩, 逃:)
話說回來,今天在寫一個工具類,裡面用了@Autowired注入了TokenRepository以及TokenService時,在TokenRepositoryfindFirstById()方法一直報 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 還有好多不懂的,學的也不是太深入;最近由於時間緊就只能淺嘗輒止了= = 日後填坑