【问题标题】:Spring - Null pointer exception when using HttpHeaders with @RequestHeadersSpring - 将 HttpHeaders 与 @RequestHeaders 一起使用时出现空指针异常
【发布时间】:2019-01-25 22:31:06
【问题描述】:

我不熟悉 spring,但我遇到了这个问题,我在 org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver.resolveArgument(RequestHeaderMapMethodArgumentResolver.java:72) 遇到了 nullpointerexception

我能够随机发现是这个 @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);
}

我尝试在没有HttpHeaders 的情况下使用@RequestHeaders,就像这样

@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);
/*    */         }
/*    */       }

【问题讨论】:

    标签: java spring http-headers


    【解决方案1】:

    HttpHeaders 可用于放入 ResponseEntity 对象作为控制器方法的返回值。这种类型的参数不是由 Spring 自动创建的。还有很多其他类可以使用。见https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-arguments

    也许您将 WebRequest 作为方法参数并使用 WebRequest#getHeader 来获取方法中的特定标头值。

    【讨论】:

    • 在这种情况下,无论是否使用request.getHeader,似乎都没有使用headers?在我看来是这样,但我对 spring 了解不够,我认为最初的 PR 一定是有原因的
    • 尝试用HttpHeaders参数去掉注解@RequestHeader
    • 是的,我知道这可以解决问题。但我很好奇我的标题格式是否存在可能导致此异常的问题
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2021-01-27
    • 2020-03-21
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多