Spring — исключение нулевого указателя при использовании HttpHeaders с @RequestHeaders

Я не знаком с 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???

Ниже показано, как выглядит заголовок моего запроса:

Spring — исключение нулевого указателя при использовании HttpHeaders с @RequestHeaders

Кажется, это проблемный раздел, который я извлек из декомпилятора с исключением, выброшенным в строке 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);
/*    */         }
/*    */       }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 076
1

Ответы 1

HttpHeaders можно использовать для помещения в объект ResponseEntity в качестве возвращаемого значения метода контроллера. Параметры этого типа не создаются Spring автоматически. Есть много других классов, которые можно использовать. См. https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-arguments

Возможно, вы используете WebRequest в качестве параметра метода и WebRequest#getHeader, чтобы получить конкретное значение заголовка внутри вашего метода.

В этом случае кажется, что headers даже не используется, независимо от того, используется request.getHeader или нет? Мне так кажется, но я недостаточно знаю о весне и предполагаю, что должна была быть причина, по которой первоначальный PR был написан таким образом.

Steven Hsu 25.01.2019 23:49

Попробуйте удалить аннотацию @RequestHeader с параметром HttpHeaders.

Thomas Bosch 25.01.2019 23:58

да, я знаю, что это решает проблему. Но мне любопытно, есть ли какая-то проблема с форматированием моих заголовков, которая может вызывать это исключение.

Steven Hsu 29.01.2019 17:48

Другие вопросы по теме