我有一個用例,其中對 SpringBoot 應用程式的每個 HTTP 請求都將在標頭中包含一個 id。我需要呼叫一個內部服務來根據那個 id 檢索存盤在我的資料庫中的資訊;然后,這些資訊將在 RestControllers 呼叫的我的服務中使用。
我曾考慮過使用攔截器,但即使它們允許我呼叫我的服務并檢索資料庫中的資訊,我也無法將該物件轉發給我的業務服務。我探索過的另一條路徑是通過 AOP。但是,雖然您可以在方面內部檢索呼叫您的方法的資訊,但我認為您無法訪問由帶注釋方法內部的方面檢索的資料。
有沒有辦法在不使用 @RequestHeader 并在每個 RestController 的方法中手動呼叫我的服務(從而復制大量代碼)的情況下正確執行此操作?
謝謝 !
uj5u.com熱心網友回復:
但即使這些允許我呼叫我的服務并在資料庫中檢索資訊,我知道沒有辦法將該物件轉發給我的業務服務
您可以使用HttpServletRequest request具有 http 請求范圍的 ,這意味著為客戶端在服務器中發出的每個 http 請求創建一個新物件。您可以通過每個攔截器用其他資訊豐富它,以便在傳遞給最終控制器方法時將其作為屬性包含在內。
使用下面的方法HandlerInterceptor,會在呼叫spring業務方法之前呼叫。
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
然后在此方法中,您可以將所需的值設定為請求物件中的屬性。
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
... call external api and fetch some value....
... Object myObj = apiCall...
request.setAttribute("myObj", myObj);
return true;
}
然后在你的 spring 控制器中你可以訪問你之前設定的這個屬性。
@GetMapping(path = "/{mypath}")
public void getRequest(HttpServletRequest request){
Object myObj = request.getAttribute("myObj");
if (myObj != null) {
//you have myObj accessible here!
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384507.html
