2016-12-22 17 views
0

私はhttp://localhost:8080/documentsに応答するレストコントローラを持っています。 私はそれを呼び出す権限ヘッダーが必要です。春休みテンプレート401エラーレスポンス

だから私は持っている私のクライアントコードで:

HttpHeaders headers = new HttpHeaders(); 
headers.set(HttpHeaders.AUTHORIZATION, "myToken"); 
HttpEntity entity = new HttpEntity(null, headers); 

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

response = restTemplate.exchange("http://localhost:8080/documents", HttpMethod.GET, entity, Document[].class); 

すべてが正常に動作します。 その後、私はエラーをテストしたい。 したがって、私は認証ヘッダーを削除します。

私がpostmanのようなツールでテストすると、私は401応答を受け取ります。 しかし、私の残りのテンプレートでは、私はIllegalArgumentExceptionを受け取るだけです。

私はResponseErrorHandlerをテストしました。

public class MyErrorHandler implements ResponseErrorHandler { 

    @Override 
    public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException { 
     return false; //i've also tried return true 
    } 

    @Override 
    public void handleError(ClientHttpResponse clientHttpResponse) throws IOException { 
     String theString = IOUtils.toString(clientHttpResponse.getBody()); 
     FunctionalTestException exception = new FunctionalTestException(); 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put("code", clientHttpResponse.getStatusCode().toString()); 
     properties.put("body", theString); 
     properties.put("header", clientHttpResponse.getHeaders()); 
     exception.setProperties(properties); 
     throw exception; 
    } 
} 

、私のクライアントに私はそれが動作しませんでした

restTemplate.setErrorHandler(new MyErrorHandler()); 

を持っています。

私の質問は、残りのテンプレートを使用して401エラー応答を見つける方法です。

java.lang.IllegalArgumentException: invalid start or end 

とスタックトレース:ここ

は例外です

sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1455) 
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2979) 
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:489) 
org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:84) 
org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) 
org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) 
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:619) 
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) 
org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498) 
org.boite.dq.steps.UnauthorizedUser.callListCategories(UnauthorizedUser.java:61) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:498) 
org.jbehave.core.steps.StepCreator$ParametrisedStep.perform(StepCreator.java:733) 
org.jbehave.core.embedder.PerformableTree$FineSoFar.run(PerformableTree.java:346) 
org.jbehave.core.embedder.PerformableTree$PerformableSteps.perform(PerformableTree.java:1088) 
org.jbehave.core.embedder.PerformableTree$AbstractPerformableScenario.performRestartableSteps(PerformableTree.java:953) 
org.jbehave.core.embedder.PerformableTree$NormalPerformableScenario.perform(PerformableTree.java:992) 
org.jbehave.core.embedder.PerformableTree$PerformableScenario.perform(PerformableTree.java:902) 
org.jbehave.core.embedder.PerformableTree$PerformableStory.performScenarios(PerformableTree.java:825) 
org.jbehave.core.embedder.PerformableTree$PerformableStory.perform(PerformableTree.java:798) 
org.jbehave.core.embedder.PerformableTree.performCancellable(PerformableTree.java:422) 
org.jbehave.core.embedder.PerformableTree.perform(PerformableTree.java:393) 
org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:292) 
org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:266) 
java.util.concurrent.FutureTask.run(FutureTask.java:266) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
+0

投稿してくださいフルスタックトレースを使用して送信することです:回避策はあります提案しました。また、サーバーコードが承認ポイントに達したかどうかを確認しましたか? – jannis

+0

ありがとう@jannis、私はスタックトレースを追加しました。はい、私は自分のコードが承認ポイントに達すると確信しています。 – vincent

+0

これを再現できませんでした。私の場合、これは正常に動作します - 私は401状態で応答します。郵便配達員と一緒に得た401のHTTP応答全体を投稿してください。たぶんそれは整形式ではないので、RestTemplateがクラッシュする可能性があります。 – jannis

答えて

1

クラッシュが私は(あなたの応答ヘッダーの1つが不正であることではない疑いがあると思いますHttpURLConnection::getHeaderFieldで何が起こっているのかHttpURLConnectionがそれを期待している)。通常401応答には、サービスでサポートされている認証方法にエージェントを指すWWW-Authenticate応答ヘッダーが付いています。私はこのヘッダーがクラッシュを引き起こすと思われる。

A bug reportは、HttpURLConnectionWWW-Authenticationヘッダー形式にいくつかの制約を課していることを示しています。この特定のケースでは、同様のクラッシュを引き起こす値はoauth_problem=token_rejectedです。

回避策は有効なヘッダー値(仕様準拠)か、クライアント側で取得ApacheConnector

+1

有効な値を送信するための "回避策":D – Raniz

+0

確かに問題はありますが、春と一部のビジネスケースのために修正できませんが、これは検索に最適な方法です – vincent

関連する問題