AndroidアプリケーションでrestTemplate(Spring Androidフレームワークから)を使用して、ポストでレストサーバーに接続しています。AsyncTaskを使用してリクエストを送信し、POJOである2つのクラスRequestとResponseをJson形式で送信しています。
public class RequestSender extends AsyncTask<Object, Void, Response> {
private RestTemplate restTemplate = new RestTemplate();
private static final String SERVER_REQUEST_PATH = "/path/to/rest/service";
@Override
protected Response doInBackground(Object... args) {
String url = (String) args[0] + SERVER_REQUEST_PATH;
Request requestArgs = (Request) args[1];
Response response = null;
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
try {
response = restTemplate.postForObject(url, requestArgs, Response.class);
} catch (RestClientException e) {
e.printStackTrace();
response = null;
}
return response;
}
}
ご覧のとおり、コードは非常に単純で、ほとんどの場合正常に動作していますが、特定の順序では動作していません。
- サーバーに対して最初の (またはそれ以上の) 要求を行います。
- アプリを再起動せずにサーバーを再起動します。
- サーバーに新しいリクエストを送信します。
次に、サーバーの再起動後の最初のリクエスト (ステップ 3) は、postForObject(...) メソッドによってサーバーに送信されませんが、次のリクエストは送信されます。この最初のリクエストでは、代わりにエラーがスローされます。
07-10 10:24:13.402: W/System.err(4827): org.springframework.web.client.ResourceAccessException: I/O error: null; nested exception is java.io.EOFException
07-10 10:24:13.402: W/System.err(4827): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)
07-10 10:24:13.402: W/System.err(4827): at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
07-10 10:24:13.402: W/System.err(4827): at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:317)
07-10 10:24:13.402: W/System.err(4827): at com.myapp.servercommunication.RequestSender.doInBackground(RequestSender.java:42)
07-10 10:24:13.406: W/System.err(4827): at com.myapp.servercommunication.RequestSender.doInBackground(RequestSender.java:1)
07-10 10:24:13.406: W/System.err(4827): at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-10 10:24:13.406: W/System.err(4827): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-10 10:24:13.406: W/System.err(4827): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-10 10:24:13.406: W/System.err(4827): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-10 10:24:13.406: W/System.err(4827): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-10 10:24:13.406: W/System.err(4827): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-10 10:24:13.406: W/System.err(4827): at java.lang.Thread.run(Thread.java:856)
07-10 10:24:13.409: W/System.err(4827): Caused by: java.io.EOFException
07-10 10:24:13.413: W/System.err(4827): at libcore.io.Streams.readAsciiLine(Streams.java:203)
07-10 10:24:13.417: W/System.err(4827): at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:560)
07-10 10:24:13.417: W/System.err(4827): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:813)
07-10 10:24:13.417: W/System.err(4827): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
07-10 10:24:13.417: W/System.err(4827): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
07-10 10:24:13.417: W/System.err(4827): at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:54)
07-10 10:24:13.417: W/System.err(4827): at org.springframework.http.client.SimpleClientHttpResponse.getStatusCode(SimpleClientHttpResponse.java:80)
07-10 10:24:13.421: W/System.err(4827): at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:46)
07-10 10:24:13.421: W/System.err(4827): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:477)
07-10 10:24:13.421: W/System.
err(4827): ... 11 more
ユースケースが重要ではない場合でも、なぜこのエラーがスローされるのか、私の実装に問題があるのでしょうか、それとも RestTemplate の非常に正常な動作でしょうか?