Browse Source

Use response decorator to check if error handled

Closes gh-34231
pull/34398/head
rstoyanchev 1 year ago committed by Brian Clozel
parent
commit
07455b10f3
  1. 41
      spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java
  2. 1
      spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java

41
spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java

@ -136,18 +136,29 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { @@ -136,18 +136,29 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler {
*/
@Override
public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
handleError(response);
// For backwards compatibility try handle(response) first
HandleErrorResponseDecorator decorator = new HandleErrorResponseDecorator(response);
handleError(decorator);
if (decorator.isHandled()) {
return;
}
handleError(response, response.getStatusCode(), url, method);
}
/**
* {@inheritDoc}
* <p>As of 6.2.1 this method is a no-op unless overridden.
*/
@SuppressWarnings("removal")
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// no-op, but here for backwards compatibility
// Called via handleError(url, method, response)
if (response instanceof HandleErrorResponseDecorator decorator) {
decorator.setNotHandled();
return;
}
// Called directly, so do handle
handleError(response, response.getStatusCode(), null, null);
}
/**
@ -277,4 +288,22 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { @@ -277,4 +288,22 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler {
};
}
private static class HandleErrorResponseDecorator extends ClientHttpResponseDecorator {
private boolean handled = true;
public HandleErrorResponseDecorator(ClientHttpResponse delegate) {
super(delegate);
}
public void setNotHandled() {
this.handled = false;
}
public boolean isHandled() {
return this.handled;
}
}
}

1
spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java

@ -65,7 +65,6 @@ public interface ResponseErrorHandler { @@ -65,7 +65,6 @@ public interface ResponseErrorHandler {
*/
@Deprecated(since = "6.2.1", forRemoval = true)
default void handleError(ClientHttpResponse response) throws IOException {
// no-op unless overridden
}
}

Loading…
Cancel
Save