2016-09-16 56 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