Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-ServletWebRequest.getHeaderValues()未返回所有标头_Java_Spring_Servlets_Http Headers_Request Headers - Fatal编程技术网

Java Spring-ServletWebRequest.getHeaderValues()未返回所有标头

Java Spring-ServletWebRequest.getHeaderValues()未返回所有标头,java,spring,servlets,http-headers,request-headers,Java,Spring,Servlets,Http Headers,Request Headers,我的控制器功能设置如下 @RequestMapping(value = "/test/index.html", method = RequestMethod.GET) public ModelAndView prepareView(HttpServletRequest request, @RequestHeader HttpHeaders header) 我从这里得到了一个空指针异常 org.springframework.web.method.annotation.RequestHead

我的控制器功能设置如下

@RequestMapping(value = "/test/index.html", method = RequestMethod.GET)
public ModelAndView prepareView(HttpServletRequest request, @RequestHeader HttpHeaders header) 
我从这里得到了一个空指针异常

 org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver.resolveArgument(RequestHeaderMapMethodArgumentResolver.java:72) 
所以我反编译了这个类文件,并在调试模式下逐步完成。代码中有问题的部分如下所示:

/* 70 */       for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
/* 71 */         String headerName = (String)iterator.next();
/* 72 */         for (String headerValue : webRequest.getHeaderValues(headerName)) {
/* 73 */           result.add(headerName, headerValue);
/*    */         }
/*    */       }
/*70*/for(迭代器迭代器=webRequest.getHeaderNames();迭代器.hasNext();){
/*71*/String headerName=(String)迭代器.next();
/*72*/for(字符串headerValue:webRequest.getheaderValue(headerName)){
/*73*/结果添加(headerName,headerValue);
/*    */         }
/*    */       }
webRequest
是类型为
NativeWebRequest
的对象。因此在第70行中,我可以看到
webRequest.getHeaderNames()
正在返回 例如,我在chrome网络选项卡中看到的请求头

显然,负载平衡器(netscaler)在创建请求后插入了一些我在chrome中看不到的头文件(我称之为
x-model

在这个跟踪之后,我看到所有标准的requestheader都经过了检查,并且添加时没有出现任何问题(即
Accept
Cookie
Host
,等等)。但是,第70行的迭代器最终到达
x-model
头。然后在第72行中,调用了
webRequest.getHeaderValues('x-model')
,由于没有找到称为x-model的头,因此返回null。这会在增强的foreach上导致空指针

为什么
ServletWebRequest.getHeaderNames()
ServletWebRequest.getHeaderValues(headerName)
返回的内容不一致?如何解决此问题

我注意到,当我查看第70行中创建的迭代器时,有一个键集hashmap,其中包含
[cookie、连接、接受语言、主机、接受、用户代理、接受编码、引用器、x-model、x-tenant、升级不安全请求]
。但是,表条目不包含x-model的条目。我提到的两个对象请参见附图

我正在使用Java7和Spring4.0.7


这里的table和entryset有什么区别?为什么entryset包含
x-model
条目,而table不包含该条目?

因此,问题实际上是因为有人向
HttpServletRequestWrapper.getHeaderNames()
添加了一个覆盖,spring使用该覆盖来检索headernames列表,以支持,但是没有覆盖
HttpServletRequestWrapper.getHeaders()
,这是spring用来查找头的值的方法

这个头
x-model
有值吗?有值,但是当我实际检查迭代器时,值是一个对象,奇怪的是我在迭代器中看不到这个条目。但是它必须在那里,因为它被选中了。我现在看到它在键集中,但不是表中的实际条目,你知道这是在哪里设置的吗?我想在春天里,你还能解释更多吗?值是
KeySet?
非常好的捕捉。我花了半天的时间在WebRequest上搜索,这很简单,但你的回答让我很开心!谢谢。