简体   繁体   English

resttemplate.exchange 抛出空指针异常

[英]resttemplate.exchange throws null pointer exception

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

Throws null pointer exception when trying to create an object.尝试创建对象时抛出空指针异常。

I checked entity and url, it is getting printed in Logger message.我检查了实体和 url,它被打印在 Logger 消息中。 But at this line it throws null pointer exception, but the object is still getting created..但是在这一行它抛出空指针异常,但对象仍在创建中..

If the object is getting created how can this throw null pointer exception..如果正在创建对象,这如何抛出空指针异常..

I am using kubernetes, when i check command line in kubernetes it says object got created..but in logs it shows null pointer exception我正在使用 kubernetes,当我在 kubernetes 中检查命令行时,它说对象已创建......但在日志中它显示空指针异常

The problem seem to be that you are executing the request two times .问题似乎是您执行了两次请求。

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

Both postForEntity and exchange are sending a post request to your url . postForEntityexchange都向您的url发送 post 请求。 postForEntity can be seen as a specific case for the exchange method. postForEntity可以看作是exchange方法的一个具体案例。 See the documentation查看文档

Please use only one of them, for example:请仅使用其中之一,例如:

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

I had a similar issue and was with it for 2 days.我有一个类似的问题,并用了 2 天。 Below was my stacktrace.下面是我的堆栈跟踪。

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)

The root cause was in the availableCharsets() static method in Charset class.根本原因在于 Charset 类中的 availableCharsets() 静态方法。 One of the charset provider was returning a null iterator and the below piece of code i.hasNext() was throwing a null pointer exception.其中一个字符集提供程序返回了一个空迭代器,下面的代码 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);
        }
    }

If you backtrace the stacktrace call, the StringHttpMessageConverter.writeInternal() method checks the writeAcceptCharset boolean and then calls the getAcceptedCharsets() from where Charset static method is called.如果您回溯堆栈跟踪调用,则 StringHttpMessageConverter.writeInternal() 方法检查 writeAcceptCharset 布尔值,然后从调用 Charset 静态方法的位置调用 getAcceptedCharsets()。 To avoid this call, add the below lines.为避免此调用,请添加以下行。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM