在 HttpServletRequest 的 headerNames 枚举上使用 Collectors.toMap 创建 HttpHeader 时出现编译错误

Compilation error creating HttpHeaders using Collectors.toMap on the HttpServletRequest's headerNames Enumeration

我正在尝试将所有现有 headers 从 HttpServletRequest 复制到 Spring HttpHeaders object 以与 RestTemplate 一起使用.这可以在枚举循环中轻松完成,但我在使用流时遇到此错误:

HttpHeaders headers = new HttpHeaders();
Enumeration<String> existingHeaders = request.getHeaderNames();

headers.putAll(
 Collections.list(existingHeaders)
.stream()
.collect(
Collectors.toMap(Function.identity(),HttpServletRequest::getHeader))
);

我为流声明变量 Enumeration<String> 不将元素视为 Object 但我仍然在 collect():

处收到此编译错误
The method toMap(Function<? super T,? extends K>, Function<? super T,? extends U>) 
in the type Collectors is not applicable for the arguments
(Function<Object,Object>, HttpServletRequest::getHeader)

要从 HttpServletRequest 中获取 HttpHeaders,您可以使用 spring-web 中的 ServletServerHttpRequest class。由于 HttpHeaders class 也在 spring-web 中,您应该已经在您的 class 路径中提供了此 class。

private static HttpHeaders getHttpHeaders(HttpServletRequest request) {
  return new ServletServerHttpRequest(request).getHeaders();
}

此答案并未解决您收到错误的原因,但它确实解决了您试图解决的根本问题:从现有的 HttpServletRequest 中获取 HttpHeaders .

您的代码无法编译的原因是其 Collectors.toMap(...) 调用生成了 Map<String, String>,但 headers.putAll(...) 需要 Map<String, List<String>>。这可以通过更改 Collectors.toMap(...) 调用来生成兼容地图来解决:

HttpHeaders headers = new HttpHeaders();
Enumeration<String> existingHeaders = request.getHeaderNames();

headers.putAll(Collections.list(existingHeaders)
        .stream()
        .collect(Collectors.toMap(Function.identity(), 
                name -> Collections.list(request.getHeaders(name)))));

由于同一个 HTTP header 可以有多个值,HttpHeaders implements Map<String,List<String>> rather than Map<String,String>. Therefore, putAll(map) 需要一个具有 List<String> 个值的映射,而不是一个具有 String 个值的映射。