2016-09-16 57 views
0

在控制器注入HTTP請求頭到服務豆,我可以使用下面的代碼如何使用彈簧

@RestController 
public class MyController { 
@RequestMapping(value = "/mypath", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity moveEnrollment(@RequestHeader Map<String, String> headers) { 
    ..invoke business logic 
} 
} 

訪問所有@RequestHeader■如何注入頭在Spring的服務Bean上是不是一個控制器?否則,我需要將這個hashmap傳遍整個地方。

我知道我可以注入HttpServletRequest然後獲取標題,但如果它可以直接注入,它會更容易。

回答

0

你缺少的是HttpServletRequest是一個請求到你的Web應用程序的實例。這不是一個全局bean,你可以在其他類中注入。這是每個請求的新實例。 您的標題也一樣,它們只在請求的上下文中有效。你無法在全球任何地方注入它們。 在你的控制器中,它們被傳遞給你的控制器方法,就我所知,它們在你的非控制器實例中不可用。

還有其他類型的處理程序,如ExceptionHandler和Controller的建議,您可以在方法中訪問請求,但不能在任意類中訪問請求。它必須在請求的上下文中。

+1

你實際上可以在任何地方注入HttpServletRequest。如果調用線程是http請求的一部分,那麼它實際上就是那個請求實例。但是如果線程不是請求線程,則它爲空。 –

+0

我明白你在說什麼,但我認爲安倍要求的是將它注入服務而不是方法。我解釋說請求不是全局bean,而是每個請求。 –

+1

@AminJ你可以注入httpservletrequest對象到spring服務bean中。我猜測這是使用threadlocals完成的。因此,即使httprequest對象是每個請求都是新的,但該bean將爲該線程正確注入。問是否我也可以對請求標題也做同樣的事情。 – Abe