如何创建自定义HttpHeaders

时间:2018-06-04 18:11:25

标签: spring spring-boot

如果我这样做:

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

headers包含所有标题。我想创建一个继承自HttpHeaders的类,以便添加新属性:

class CustomHttpHeaders extends HttpHeaders {
    public String getCustomHeader() { ... } 
}

但如果我这样做:

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

它没有用。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以根据需要向请求添加标题,但实际上并不需要扩展该类。在内部,标题使用地图建模,允许您非常轻松地添加自定义<K, V>对。

因此,您应该做的是添加触发请求的自定义参数,客户端(例如:angular客户端,cURL等),以及服务器端,您可以使用相同的{{ 1}} class。

答案 1 :(得分:0)

这就是我们设法做的事情:

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);
    }
}

@Configuration
class MethodArgumentResolversConfig extends WebMvcConfigurerAdapter {

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