我有这样的控制器功能设置
@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);
/* */ }
/* */ }
webRequest
是类型NativeWebRequest
的对象。因此,在第70行中,我可以看到webRequest.getHeaderNames()
返回了
例如,我在chrome网络标签中看到的请求标头。
很明显,负载平衡器(netscaler)在创建请求后会插入一些标头(我将其称为x-model
),但在chrome中看不到。
在跟踪之后,我看到所有标准的RequestHeader都经过检查并且没有问题(即Accept
,Cookie
,Host
等)。但是,最终第70行的迭代器到达x-model
头。然后在第72行,调用webRequest.getHeaderValues('x-model')
,由于没有找到称为x-model的标头,因此返回null。这会导致增强的foreach上出现空指针。
为什么ServletWebRequest.getHeaderNames()
和ServletWebRequest.getHeaderValues(headerName)
返回的内容之间有差异?我该怎么办才能解决此问题?
我注意到,当我看一下第70行中创建的迭代器时,有一个包含[cookie, connection, accept-language, host, accept, user-agent, accept-encoding, referer, x-model, x-tenant, upgrade-insecure-requests]
的keySet哈希图。但是,表条目不包含x模型的条目。请参阅附件中我引用的2个对象的图像
我正在使用Java 7和Spring 4.0.7
这里的表和条目集有什么区别?为什么条目集包含x-model
条目,但表却不包含?
答案 0 :(得分:0)
所以问题实际上是因为有人向HttpServletRequestWrapper.getHeaderNames()
添加了覆盖,这是spring用来检索标头名称列表以支持包装标头的方法,但没有覆盖HttpServletRequestWrapper.getHeaders()
spring用于查找标头的值