私はWindowsAzureでホストされているSpring3MVCサーバーを使用しており、これを使用して、WebブラウザーとAndroidデバイスの両方を介した対話をユーザーに提供しています。すべてのコードはJavaで書かれています。
ブラウザを介してサーバーを操作する場合はすべて問題ありません。Androidを使用してサーバーを操作する場合は、サーバーがローカルホストとして実行されていれば問題なく機能します。ただし、Androidクライアントを使用してAzureでホストされているサーバーと対話すると、ランダムに(ただし常に最終的に)が取得されるNullPointerException
ため、コードが正常に実行されることもありますが、最終的にはこれが表示されます。正確にNullPointer
変更を取得しますが、それは常にを使用したHTTP呼び出し中RestTemplate
です。
もう1つの奇妙なことは、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
非常にありがたいです、特にそれがうまくいくこともあればうまくいかないこともあります
編集: https://jira.springsource.org/browse/ANDROID-102のように、もう少し調べてみると、SpringforAndroidフレームワークにバグがあるようです。
これは少し役立ちますが、それでも時々機能し、Azureベースのサーバーと対話するときにのみ失敗する理由を説明していません