Spring 如何创建自定义HttpHeaders

Spring 如何创建自定义HttpHeaders,spring,spring-boot,Spring,Spring Boot,如果我这样做: @GetMapping("hello") String hello(@RequestHeader HttpHeaders headers) { return "hello"; } 标题包含所有标题。我想创建一个继承自HttpHeaders的类,以便添加新属性: class CustomHttpHeaders extends HttpHeaders { public String getCustomHeader() { ... } } 但如果我这样做: @Ge

如果我这样做:

@GetMapping("hello")
String hello(@RequestHeader HttpHeaders headers) {
    return "hello";
}
标题
包含所有标题。我想创建一个继承自
HttpHeaders
的类,以便添加新属性:

class CustomHttpHeaders extends HttpHeaders {
    public String getCustomHeader() { ... } 
}
但如果我这样做:

@GetMapping("hello")
String hello(@RequestHeader CustomHttpHeaders headers) {
    return "hello";
}

它不起作用。我该怎么做呢?

在本例中,您可以根据自己的意愿向请求中添加头,因此实际上不需要扩展该类。在内部,头部使用映射建模,允许您非常轻松地添加自定义


因此,您应该做的是添加从哪里触发请求的自定义参数、客户端(例如:angular client、cURL等)和服务器端。您可以使用相同的
HttpHeaders
类映射头。

我们就是这样做的:

public class CustomHttpHeadersArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return CustomHttpHeaders.class.isAssignableFrom(parameter.getParameterType());
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        Map<String, String> map = new LinkedHashMap<>();
        for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
            String headerName = iterator.next();
            String headerValue = webRequest.getHeader(headerName);
            if (headerValue != null) {
                map.put(headerName, headerValue);
            }
        }
        return new CustomHttpHeaders(map);
    }
}
公共类CustomHttpHeaderArgumentResolver实现HandlerMethodArgumentResolver{
@凌驾
公共布尔支持参数(MethodParameter){
返回CustomHttpHeaders.class.isAssignableFrom(parameter.getParameterType());
}
@凌驾
公共对象resolveArgument(MethodParameter参数、ModelAndViewContainer、mavContainer、,
NativeWebRequest webRequest,WebDataBinderFactory binderFactory){
Map Map=newlinkedhashmap();
for(迭代器迭代器=webRequest.getHeaderNames();迭代器.hasNext();){
String headerName=iterator.next();
字符串headerValue=webRequest.getHeader(headerName);
if(headerValue!=null){
map.put(headerName,headerValue);
}
}
返回新的CustomHttpHeader(映射);
}
}
以及:

@配置
类MethodArgumentResolversConfig扩展WebMVCConfigureAdapter{
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
添加(新的CustomHttpHeaderArgumentResolver());
}
}

不确定您为什么需要它。。但是包装器类能做到这一点吗?
HttpHeaders
只是一个多值映射。扩展它没有多大意义。
@Configuration
class MethodArgumentResolversConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new CustomHttpHeadersArgumentResolver());
    }
}