我正在使用托管在 Windows Azure 上的 Spring 3 MVC 服务器,并使用它为用户提供通过 Web 浏览器和 Android 设备进行的交互。所有代码都是用 Java 编写的。
当我通过浏览器与服务器交互时,一切正常,当使用 Android 与服务器交互时,如果服务器作为 localhost 运行,它工作正常。但是,当我使用 Android 客户端与 Azure 托管服务器交互时,我随机(但总是最终)得到一个NullPointerException
,所以有时代码运行良好但最终会出现。正是我得到NullPointer
更改的地方,但它总是在 HTTP 调用期间使用RestTemplate
.
另一个奇怪的事情是,在调试中运行 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
s 被抛出时,服务器似乎没有收到请求,因为没有达到语句。
任何有关原因的帮助NullPointerException
将不胜感激,因为我对此感到非常困惑,尤其是有时它有效,有时却无效
编辑:根据https://jira.springsource.org/browse/ANDROID-102,在查看更多内容后,Android 框架的 Spring 中似乎存在一个错误
这有点帮助,但仍然不能解释为什么它有时会起作用,并且只会在与基于 Azure 的服务器交互时失败