У меня настроена функция контроллера, вот так:
@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 Network.
Очевидно, балансировщик нагрузки (netscaler) вставляет некоторые заголовки после создания запроса(я назову это x-model
), которое я не вижу в chrome.
Следуя этой трассировке, я вижу, что все стандартные RequestHeaders проходят и добавляются без проблем (то есть Accept
, Cookie
, Host
и т. Д.).Однако в конечном итоге итератор в строке 70 достигает заголовка x-model
.Затем в строке 72 вызывается webRequest.getHeaderValues('x-model')
, и это возвращает ноль, поскольку заголовок с именем x-model не найден.Это вызывает нулевой указатель на расширенный 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]
.Однако запись таблицы не содержит записи для x-модели.Пожалуйста, смотрите прикрепленное изображение для двух объектов, к которым я обращаюсь
Я использую Java 7 и Spring 4.0.7
В чем разница между таблицей и начальным набором здесь?Почему набор записей содержит запись x-model
, а таблица - нет?