首页 > 解决方案 > @Bean 方法中的 Http Header 字段

问题描述

我正在使用 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 ) {
    ....
    }

}

标签: javaspringspring-boot

解决方案


@RequestHeader注释仅在处理程序方法上受支持,来自此处的文档

public @interface RequestHeader

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

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

因此,在类中获取 Web 请求处理程序方法中的 Header 值,Controller并将其通过方法参数传递给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")
     }

 }

推荐阅读