From 14d16fc359e962f0915ed9fcb79a0d1d35ddc3ce Mon Sep 17 00:00:00 2001 From: SheetalAtre Date: Mon, 3 Jul 2023 23:59:14 +0530 Subject: [PATCH] feat(retrofit): add accessor to exception response body as a map --- .../exceptions/SpinnakerHttpException.java | 41 ++++++++----------- .../SpinnakerServerExceptionTest.java | 5 +++ 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerHttpException.java b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerHttpException.java index 133778400..adda01065 100644 --- a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerHttpException.java +++ b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerHttpException.java @@ -16,13 +16,10 @@ package com.netflix.spinnaker.kork.retrofit.exceptions; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.netflix.spinnaker.kork.annotations.NonnullByDefault; -import java.util.Optional; -import lombok.Getter; +import java.util.HashMap; +import java.util.Map; import org.springframework.http.HttpHeaders; import retrofit.RetrofitError; import retrofit.client.Response; @@ -46,24 +43,29 @@ public class SpinnakerHttpException extends SpinnakerServerException { */ private final String rawMessage; + private final Map responseBody; + public SpinnakerHttpException(RetrofitError e) { super(e); this.response = e.getResponse(); this.retrofit2Response = null; - RetrofitErrorResponseBody body = - (RetrofitErrorResponseBody) e.getBodyAs(RetrofitErrorResponseBody.class); + responseBody = (Map) e.getBodyAs(HashMap.class); + this.rawMessage = - Optional.ofNullable(body).map(RetrofitErrorResponseBody::getMessage).orElse(e.getMessage()); + responseBody != null + ? (String) responseBody.getOrDefault("message", e.getMessage()) + : e.getMessage(); } public SpinnakerHttpException(RetrofitException e) { super(e); this.response = null; this.retrofit2Response = e.getResponse(); - RetrofitErrorResponseBody body = - (RetrofitErrorResponseBody) e.getErrorBodyAs(RetrofitErrorResponseBody.class); + responseBody = (Map) e.getErrorBodyAs(HashMap.class); this.rawMessage = - Optional.ofNullable(body).map(RetrofitErrorResponseBody::getMessage).orElse(e.getMessage()); + responseBody != null + ? (String) responseBody.getOrDefault("message", e.getMessage()) + : e.getMessage(); } private final String getRawMessage() { @@ -95,6 +97,7 @@ public SpinnakerHttpException(String message, SpinnakerHttpException cause) { this.response = cause.response; this.retrofit2Response = cause.retrofit2Response; rawMessage = null; + this.responseBody = cause.responseBody; } public int getResponseCode() { @@ -151,19 +154,7 @@ public SpinnakerHttpException newInstance(String message) { return new SpinnakerHttpException(message, this); } - @Getter - // Use JsonIgnoreProperties because some responses contain properties that - // cannot be mapped to the RetrofitErrorResponseBody class. If the default - // JacksonConverter (with no extra configurations) is used to deserialize the - // response body and properties other than "message" exist in the JSON - // response, there will be an UnrecognizedPropertyException. - @JsonIgnoreProperties(ignoreUnknown = true) - private static final class RetrofitErrorResponseBody { - private final String message; - - @JsonCreator - RetrofitErrorResponseBody(@JsonProperty("message") String message) { - this.message = message; - } + public Map getResponseBody() { + return this.responseBody; } } diff --git a/kork-retrofit/src/test/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerServerExceptionTest.java b/kork-retrofit/src/test/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerServerExceptionTest.java index cac516c10..eb5386a2a 100644 --- a/kork-retrofit/src/test/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerServerExceptionTest.java +++ b/kork-retrofit/src/test/java/com/netflix/spinnaker/kork/retrofit/exceptions/SpinnakerServerExceptionTest.java @@ -17,11 +17,13 @@ package com.netflix.spinnaker.kork.retrofit.exceptions; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import com.netflix.spinnaker.kork.exceptions.SpinnakerException; import java.io.IOException; import java.util.List; +import java.util.Map; import okhttp3.MediaType; import okhttp3.ResponseBody; import org.junit.jupiter.api.Test; @@ -96,6 +98,9 @@ public void testSpinnakerHttpExceptionFromRetrofitException() { .build(); RetrofitException retrofitException = RetrofitException.httpError(response, retrofit2Service); SpinnakerHttpException notFoundException = new SpinnakerHttpException(retrofitException); + assertNotNull(notFoundException.getResponseBody()); + Map errorResponseBody = notFoundException.getResponseBody(); + assertEquals(errorResponseBody.get("name"), "test"); assertEquals(HttpStatus.NOT_FOUND.value(), notFoundException.getResponseCode()); assertTrue( notFoundException.getMessage().contains(String.valueOf(HttpStatus.NOT_FOUND.value())));