@Bean方法中的HTTP标头字段

时间:2018-10-01 20:16:30

标签: java spring spring-boot

我使用的是Spring Boot 2.0.5版本。我有一个@Bean方法来创建请求范围Bean,但是要创建实例,我需要访问为其创建实例的请求的HTTP标头字段。 @RequestHeader注释在我的@RestController中工作正常,但在我的@Bean方法中工作不正常。有谁知道如何在这种情况下访问该信息?

下面是我想做的一个示例,但是由于@RequestHeader注释在该比赛中不起作用,因此无法使用。

谢谢您的提示。

最诚挚的问候,多米尼克

@Configuration
public class AProducer {

@Bean
@Scope(value="request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public User produceUser( @RequestHeader(value="Accept") String acceptType ) {
    ....
    }

}

1 个答案:

答案 0 :(得分:4)

仅文档here中的处理程序方法支持

@RequestHeader批注

public @interface RequestHeader

注释,指示方法参数应绑定到Web请求标头。 在Spring MVC和Spring WebFlux中支持带注释的处理程序方法。

如果方法参数是Map,MultiValueMap或HttpHeaders,则将使用所有标头名称和值填充映射。

因此,在Controller类的Web请求处理程序方法中获取Header值,并将其通过方法参数传递给produceUser

示例:这是Controller Class中用@Controller@RestController注释的方法

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                          @RequestHeader("Keep-Alive") long keepAlive)  {
         //call the `produceUser(String reqParam)` method by autowiring `AProducer` class
}

或者简单地,您可以尝试private @Autowired HttpServletRequest request;类中的AProducer并按照@JB Nizet的建议获取标题;

@Configuration
public class AProducer {

  private @Autowired HttpServletRequest request

 @Bean
 @Scope(value="request", proxyMode = ScopedProxyMode.TARGET_CLASS)
 public User produceUser( @RequestHeader(value="Accept") String acceptType ) {
....      //String value =request.getHeader("Accept")
     }

 }