@HeaderMap 是 Netflix Feign 中的一个注解,主要用于将一个 Map 类型的对象中的键值对作为 HTTP 请求头添加到 Feign 客户端发送的请求中。
在实际应用中,当需要动态地设置请求头,或者根据不同的业务逻辑添加多个自定义请求头时,这个注解非常有用。它提供了一种灵活的方式来传递请求头信息,比如认证令牌、用户代理信息、内容类型等。
假设你有一个服务需要进行纯文本数据交互并且需要传递认证信息。可以像下面这么做:
(1)服务代码:
@GetMapping("/header1")
public String header1(@RequestHeader("Custom-Header") String customHeader,
@RequestHeader("Authorization") String token,
@RequestHeader("Content-Type") String contentType) {
return "Custom-Header=" + customHeader +
"<br/>Authorization=" + token +
"<br/>Content-Type=" + contentType;
}(2)Feign 客户端接口定义:
@RequestLine("GET /simple/header1")
String header2(@HeaderMap Map<String,String> headers);(3)调用 Feign 客户端:
@GetMapping("/")
public String index() {
Map<String,String> headers = new HashMap<>();
headers.put("Authorization", "Bearer e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
headers.put("Content-Type", "text/plain");
return SimpleFeign.create().header2(headers);
}输出结果如下:

下面是 @HeaderMap 注解的源码:
package feign;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface HeaderMap {
}从源码看,@HeaderMap 注解仅是一个标记注解,没有提供属性。