2013-05-25 61 views
18

私たちのアプリには2つの部分があります。サーバー - RESTサービスとクライアントを提供する - Spring restTemplateを使用してそれらを消費します。java.net.HttpRetryException:サーバー認証、ストリーミングモードで再試行できません

HTTPステータスに加えて、私たちのサーバは、エラーを詳細に記述するJSONとともにHTTP本体を返します。 それで、私はcustimエラーハンドラをrestTemplateに追加して、エラーではないものとしてコード化されたエラーを処理しました.HTMLボディをよく解析するのに役立ちます。

しかし、HTTP/1.1 401 Unauthorizedの場合はHTTPボディの解析で例外が発生します。 他のすべてのエラーコードは、エラーの場合にHTTP応答を送信する私たちは、プレーンなサーバー・ロジックを使用しているファイン(400、402、など) に処理され、エラーの種類ごとに特別なルールません:

writeErrorToResponse(int status, String errMsg, HttpServletResponse resp) throws IOException { 
     response.setStatus(status); 
     response.setContentType(MediaType.APPLICATION_JSON_VALUE); 
     String message = String.format("{\"error\":\"%s\"}", StringUtils.escapeJson(errMsg)); 
     resp.getWriter().println(message); 
    } 

しかし、上クライアントのみHTTP/1.1 401は例外をスロー - "java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode"

私はいくつかのデバッグを行い、問題の原因はSimpleClientHttpResponseのコードで見てきました:

HttpURLConnection.getInputStream()

私の質問は、Javaの原因となることができるものである

HTTP/1.1 401 Unauthorized 
X-Powered-By: Servlet/3.0 
Content-Type: application/json 
Content-Language: en-GB 
Content-Length: 55 
Date: Sat, 25 May 2013 11:00:21 GMT 
Server: WebSphere Application Server/8.0 

{"error":"I cant find that user. Please try again."} 

: メッセージがクライアント上で正しく解析されます:

HTTP/1.1 402 Payment Required 
X-Powered-By: Servlet/3.0 
Content-Type: application/json 
Content-Language: en-GB 
Content-Length: 55 
Connection: Close 
Date: Sat, 25 May 2013 10:10:44 GMT 
Server: WebSphere Application Server/8.0 

{"error":"I cant find that user. Please try again."} 

、例外の原因であるメッセージフィドラーでトレース

は私に次の応答を持っていますこの状況で.net.HttpRetryException?

さらに、:このメカニズムはうまくいきました。しかし、私たちはアプリで多くのコードを変更しています。

+0

が、私は同じ問題を抱えていますHttpClientPolicy使用してチャンクを無効にするにはどうすればよいこれを解決するには? – user1182217

+1

私は回避策を立てました:1)エラーとして403を処理するカスタムエラーハンドラに追加されました。 2)例外をキャッチし、403エラーコードを処理します。しかし、この場合、HTTP本体を解析することはできません。 –

+0

@ user1182217私の答えを見る –

答えて

6

あなたのRestTemplateに設定されたHttpComponentsClientHttpRequestFactoryを渡すと効果があると思います。 Here解決方法が見つかりました。

このような開発ソリューションを使用した理由は、401や404などのHttpエラー応答の本体で応答メッセージを処理し、アプリケーションを実際のサーバー側の環境に展開できるようにするためです。

11

SimpleClientHttpRequestFactoryを使用して同じ問題が発生しました。

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); 
requestFactory.setOutputStreaming(false); 
return requestFactory; 

この問題は、チャンク化とそれに続く認証メカニズムの再試行メカニズムが原因です。

ます。また...

関連する問題