Я не знаком с Spring, но я сталкиваюсь с этой проблемой, когда я сталкиваюсь с исключением нулевого указателя на org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver.resolveArgument(RequestHeaderMapMethodArgumentResolver.java:72)
Я смог случайным образом выяснить, что именно эта аннотация @RequestHeader вызывает проблему, но не могу понять, почему. Странно то, что даже не похоже, что возвращаемый объект HttpHeaders вообще не используется в функции. Я сделал быстрый поиск, но не смог найти, нужна ли эта аннотация вообще для функции. Вот исходный код для обработки запроса с этой проблемой
@RequestMapping(value = "/webforms/index.html", method = RequestMethod.GET)
public ModelAndView prepareView(HttpServletRequest request, @RequestParam(value = "signoffId", required=false) Integer signoffId, @RequestHeader HttpHeaders headers) {
clearErrorsForNewRequest(request);
return prepareView(request, VIEW, signoffId);
}
Пробовал использовать @RequestHeaders без HttpHeaders вот так
@RequestMapping(value = "/webforms/index.html", method = RequestMethod.GET)
public ModelAndView prepareView(HttpServletRequest request, @RequestParam(value = "signoffId", required=false) Integer signoffId, @RequestHeader String host) {
clearErrorsForNewRequest(request);
return prepareView(request, VIEW, signoffId);
}
и я больше не получаю это исключение. Что здесь происходит? Я ясно вижу заголовки http, когда делаю запрос, почему я получаю это исключение в Spring? Есть ли какие-то ограничения на то, какие запросы могут использовать объект HttpHeaders???
Ниже показано, как выглядит заголовок моего запроса:
Кажется, это проблемный раздел, который я извлек из декомпилятора с исключением, выброшенным в строке 72. Похоже, что исключение nullpointerexception может исходить от webRequest, но оно явно не выдает исключение в строке 70.
/* 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);
/* */ }
/* */ }




HttpHeaders можно использовать для помещения в объект ResponseEntity в качестве возвращаемого значения метода контроллера. Параметры этого типа не создаются Spring автоматически. Есть много других классов, которые можно использовать. См. https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-arguments
Возможно, вы используете WebRequest в качестве параметра метода и WebRequest#getHeader, чтобы получить конкретное значение заголовка внутри вашего метода.
Попробуйте удалить аннотацию @RequestHeader с параметром HttpHeaders.
да, я знаю, что это решает проблему. Но мне любопытно, есть ли какая-то проблема с форматированием моих заголовков, которая может вызывать это исключение.
В этом случае кажется, что
headersдаже не используется, независимо от того, используетсяrequest.getHeaderили нет? Мне так кажется, но я недостаточно знаю о весне и предполагаю, что должна была быть причина, по которой первоначальный PR был написан таким образом.