【问题标题】:resttemplate.exchange throws null pointer exceptionresttemplate.exchange 抛出空指针异常
【发布时间】:2017-07-13 09:08:47
【问题描述】:
restTemplate.postForEntity(url,entity, String.class);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

尝试创建对象时抛出空指针异常。

我检查了实体和 url,它被打印在 Logger 消息中。但是在这一行它抛出空指针异常,但对象仍在被创建..

如果对象正在被创建,怎么会抛出空指针异常..

我正在使用 kubernetes,当我在 kubernetes 中检查命令行时,它说对象已创建..但在日志中它显示空指针异常

【问题讨论】:

  • 你能发布stackTrace吗?
  • @Luanmalaguti 我尝试评论resttemplate.postforentity,在评论该行之后,在日志中-> 对象正在成功创建..resttemplate.postforentity 和resttemplate.exchange 不能并行使用?
  • @JavaLearner1 请发布异常。另一件事:你使用这两个请求吗? restTemplate.postForEntity(url,entity, String.class); 已经返回给你一个ResponseEntity&lt;String&gt; response。见documentation
  • 我的意思是,您能否发布您收到@JavaLearner1 的 NullPointer 异常日志
  • @kamwo 是的,那是我的错误..我同时使用了这两个请求,所以它试图创建对象 2 次..这引发了错误..

标签: java spring kubernetes resttemplate


【解决方案1】:

问题似乎是您正在执行请求两次

restTemplate.postForEntity(url, entity, String.class);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

postForEntityexchange 都在向您的 url 发送发帖请求。 postForEntity 可以看作是exchange 方法的一个特例。见documentation

请只使用其中一种,例如:

ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,并且使用了 2 天。下面是我的堆栈跟踪。

    java.lang.NullPointerException
        at java.nio.charset.Charset.put(Charset.java:538)
        at java.nio.charset.Charset.access$200(Charset.java:271)
        at java.nio.charset.Charset$3.run(Charset.java:584)
        at java.nio.charset.Charset$3.run(Charset.java:573)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.nio.charset.Charset.availableCharsets(Charset.java:572)
        at org.springframework.http.converter.StringHttpMessageConverter.getAcceptedCharsets(StringHttpMessageConverter.java:119)
        at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:103)
        at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:41)
    

    根本原因在于 Charset 类中的 availableCharsets() 静态方法。其中一个字符集提供程序返回了一个空迭代器,而下面的代码 i.hasNext() 抛出了一个空指针异常。

    private static void put(Iterator<Charset> i, Map<String,Charset> m) {
            while (i.hasNext()) {
                Charset cs = i.next();
                if (!m.containsKey(cs.name()))
                    m.put(cs.name(), cs);
            }
        }
    

    如果您回溯堆栈跟踪调用,则 StringHttpMessageConverter.writeInternal() 方法会检查 writeAcceptCharset 布尔值,然后从调用 Charset 静态方法的位置调用 getAcceptedCharsets()。为避免此调用,请添加以下行。

    StringHttpMessageConverter stringHttpMessageConverter=new StringHttpMessageConverter(Charset.forName("UTF-8"));
    stringHttpMessageConverter.setWriteAcceptCharset(false);
    responseEntity=restTemplate.exchange(requestUrl.toString(), HttpMethod.GET,request, <your_class>.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 2020-08-10
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多