gpt4 book ai didi

android - 在 Android 中使用 Spring RestTemplate 时出现 NullPointerException

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:40 27 4
gpt4 key购买 nike

我正在使用托管在 Windows Azure 上的 Spring 3 MVC 服务器,并使用它为用户提供通过 Web 浏览器和 Android 设备的交互。所有代码都是用 Java 编写的。

当我通过浏览器与服务器交互时,一切正常,当使用 Android 与服务器交互时,如果服务器作为本地主机运行,则一切正常。但是,当我使用 Android 客户端与 Azure 托管服务器交互时,我会随机(但最终总是)收到 NullPointerException,因此有时代码运行良好,但最终会出现这种情况。正是在我获得 NullPointer 更改的位置,但它总是在使用 RestTemplate 的 HTTP 调用期间发生。

另一个奇怪的事情是,在调试中运行 Android 应用程序时,代码将运行到代码中的某个任意点(仍然在 RestTemplate 调用时崩溃),但是 的堆栈跟踪>NullPointerException 将指向之前进行的调用。

我为调用编写的一般代码类似于以下内容:

 private class ChangeDirectory extends AsyncTask< String, Void, Boolean >
{
@Override
protected Boolean doInBackground(String... directoryName) {

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add( new StringHttpMessageConverter() );

String url = "http://" + Constants.DNS +"/ui/android/cloud/change_directory";

restTemplate.put(url,
directoryName[0]);
return true;
}
}

堆栈跟踪如下所示:

09-05 11:32:05.081: E/AndroidRuntime(535): Caused by: java.lang.NullPointerException
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.http.client.SimpleClientHttpResponse.getStatusCode(SimpleClientHttpResponse.java:62)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:46)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:476)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:438)
09-05 11:32:05.081: E/AndroidRuntime(535): at org.springframework.web.client.RestTemplate.put(RestTemplate.java:364)
09-05 11:32:05.081: E/AndroidRuntime(535): at com.artmaps.im.activity.HomeActivity$ChangeDirectory.doInBackground(HomeActivity.java:192)
09-05 11:32:05.081: E/AndroidRuntime(535): at com.artmaps.im.activity.HomeActivity$ChangeDirectory.doInBackground(HomeActivity.java:1)
09-05 11:32:05.081: E/AndroidRuntime(535): at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-05 11:32:05.081: E/AndroidRuntime(535): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-05 11:32:05.081: E/AndroidRuntime(535): ... 5 more

指向 restTemplate.put(url, DirectoryName[0]); 调用

我尝试在服务器端放入语句,当抛出这些 NullPointer 时,服务器似乎没有收到请求,因为未到达语句。

任何有关NullPointerException原因的帮助都将非常感激,因为我对此感到非常困惑,特别是有时它有效,有时不起作用

编辑:经过更多查看后,Spring for Android 框架中似乎存在一个错误,如 https://jira.springsource.org/browse/ANDROID-102 所示。

这有一点帮助,但仍然无法解释为什么它有时会起作用,并且仅在与基于 Azure 的服务器交互时才会失败

最佳答案

我想我应该发布我发现的内容,以防其他人陷入困境。事实证明,它与我在问题编辑中发布的错误有某种关系。

我通过删除 Spring RestTemplate 调用并使用 DefaultHttpClient 来解决这个问题。

例如改变这个:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add( new StringHttpMessageConverter() );

String url = "http://" + Constants.DNS +"/ui/android/cloud/change_directory";

restTemplate.put(url,
directoryName[0]);
return true;

对此:

String url = "http://" + Constants.DNS +"/ui/android/cloud/change_directory";
try {

HttpClient client = new DefaultHttpClient();
HttpPut putRequest = new HttpPut(url);
putRequest.setEntity(new StringEntity(directoryName[0]));
client.execute(putRequest);

} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

关于android - 在 Android 中使用 Spring RestTemplate 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12280629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com