如果我这样做:
@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";
}
它没有用。我怎么能这样做?
答案 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());
}
}