在 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
个值的映射。
我正在尝试将所有现有 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
个值的映射。