resttemplate.exchange抛出空指针异常

时间:2017-07-13 09:08:47

标签: java spring kubernetes resttemplate

UPDATE Table1 SET Table1.parameterA = 1
   WHERE Table1.parameterB = ? 
   AND Table1.parameterC IN (
     SELECT Table2.id 
       FROM Table2 
       WHERE Table2.parameterD = ? AND Table2.date > ?
   )

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

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

如果正在创建对象,那么如何抛出空指针异常..

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我有一个类似的问题,并且持续了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()静态方法中。一个字符集提供程序正在返回一个null迭代器,下面的代码i.hasNext()抛出了一个null指针异常。

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);
        }
    }

如果回溯stacktrace调用,则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);