2016-12-22 1 views
0

Ich habe eine Ruhe-Controller-Antwort auf http://localhost:8080/documents. Ich sollte einen Autorisierungsheader haben, um es aufzurufen.Federauflage Vorlage 401 Fehlerantwort

Also in meinem Client-Code ich habe:

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); 

Alles funktioniert gut. Danach möchte ich die Fehler testen. Also entferne ich den Autorisierungsheader.

Wenn ich mit einem Werkzeug wie Briefträger testen, erhalte ich die 401 Antwort. Aber mit meiner Rest-Vorlage erhalte ich nur eine IllegalArgumentException.

Ich habe auch den ResponseErrorHandler getestet.

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; 
    } 
} 

und in meinem Klienten habe ich

restTemplate.setErrorHandler(new MyErrorHandler()); 

Es hat nicht funktioniert.

Also meine Frage ist, wie Sie meine 401 Fehlerantwort mit der Rest-Vorlage finden. Hier

ist die Ausnahme:

java.lang.IllegalArgumentException: invalid start or end 

und die Stack-Trace:

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

Bitte senden Sie das vollständige stacktrace Sie auf der Client-Seite erhalten zu senden. Haben Sie auch überprüft, ob Ihr Servercode den Autorisierungspunkt erreicht? – jannis

+0

danke @jannis, ich habe die Stack-Trace hinzugefügt, und ja, ich bin sicher, dass mein Code den Authorisation Point erreicht. – vincent

+0

Ich konnte das nicht reproduzieren. In meinem Fall funktioniert das normal - ich bekomme eine Antwort mit einem 401 Status. Bitte posten Sie die gesamte 401 HTTP-Antwort, die Sie mit Postman erhalten. Vielleicht ist es nicht gut ausgebildet und dies verursacht den Absturz der RestTemplate. – jannis

Antwort

1

Der Absturz passiert in HttpURLConnection::getHeaderField so würde ich vermuten, dass einer Ihrer Antwort-Header ungültig ist (nicht das, was HttpURLConnection erwartet es). Normalerweise kommt eine 401 Antwort mit einem Antwortkopf WWW-Authenticate, der den Agenten auf die vom Dienst unterstützten Authentifizierungsmethoden zeigt. Ich vermute, dass dieser Header den Absturz verursacht.

A bug report in Jersey Issue-Tracker zeigt, dass HttpURLConnection einige Einschränkungen auf das WWW-Authentication Header-Format setzt. In diesem speziellen Fall ist der Wert, der einen ähnlichen Absturz verursacht, oauth_problem=token_rejected. Eine Abhilfe vorgeschlagen ist:

Umgehung gilt Header-Werte (spec-konform) oder mit dem ApacheConnector

+1

"Workaround" um gültige Werte zu senden ...: D – Raniz

+0

Nun, das ist sicherlich das Problem, ich kann es wegen des Frühlings und einiger Geschäftsfälle nicht korrigieren, aber das ist ein guter Weg, um zu suchen, danke – vincent

Verwandte Themen