From 851d70497435fd3682c0257bc8d7096e41479598 Mon Sep 17 00:00:00 2001 From: SheetalAtre Date: Mon, 17 Jul 2023 17:54:48 +0530 Subject: [PATCH] feat(retrofit): give a custom parsing error message when fails to convert SpinnakerHttpException responsebody --- .../exceptions/RetrofitException.java | 53 ++++++++++++------- .../exceptions/SpinnakerHttpException.java | 2 +- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/RetrofitException.java b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/RetrofitException.java index c7a84b4f5..6beab7905 100644 --- a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/RetrofitException.java +++ b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/exceptions/RetrofitException.java @@ -18,12 +18,16 @@ import java.io.IOException; import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import okhttp3.MediaType; import okhttp3.ResponseBody; +import org.springframework.http.HttpStatus; import retrofit2.Converter; import retrofit2.Response; import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; /** * The {@link RetrofitException} class is similar to {@link retrofit.RetrofitError} as RetrofitError @@ -33,8 +37,7 @@ */ public class RetrofitException extends RuntimeException { public static RetrofitException httpError(Response response, Retrofit retrofit) { - String message = response.code() + " " + response.message(); - return new RetrofitException(message, response, retrofit); + return new RetrofitException(response, retrofit); } /** Response from server, which contains causes for the failure */ @@ -46,17 +49,10 @@ public static RetrofitException httpError(Response response, Retrofit retrofit) */ private final Retrofit retrofit; - private static final ResponseBody jsonErrorResponse; + private static Map jsonErrorResponseBody; - static { - jsonErrorResponse = - ResponseBody.create( - MediaType.parse("application/json; charset=utf-8"), - "{\"message\":\"Failed to parse response\"}"); - } - - RetrofitException(String message, Response response, Retrofit retrofit) { - super(message); + RetrofitException(Response response, Retrofit retrofit) { + super(response.code() + " " + response.message()); this.response = response; if (response != null) { @@ -77,21 +73,38 @@ public Response getResponse() { * @throws RuntimeException wrapping the underlying IOException if unable to convert the body to * the specified {@code type}. */ - public T getErrorBodyAs(Class type) { + public Map getErrorBodyAs() { if (response == null) { return null; } - Converter converter = retrofit.responseBodyConverter(type, new Annotation[0]); + Converter converter = + retrofit.responseBodyConverter(Map.class, new Annotation[0]); try { return converter.convert(response.errorBody()); } catch (IOException e) { - try { - return converter.convert(jsonErrorResponse); - } catch (IOException ex) { - // control is never expected to come to this block. - throw new RuntimeException(ex); - } + return jsonErrorResponseBody; } } + + static { + getJsonErrorResponseBody(); + } + + private static void getJsonErrorResponseBody() { + ResponseBody jsonErrorResponse = + ResponseBody.create( + MediaType.parse("application/json; charset=utf-8"), + "{\"message\":\"Failed to parse response\"}"); + retrofit2.Response response = + retrofit2.Response.error(HttpStatus.NOT_FOUND.value(), jsonErrorResponse); + Retrofit retrofit2Service = + new Retrofit.Builder() + .baseUrl("http://localhost") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + + RetrofitException retrofitException = httpError(response, retrofit2Service); + jsonErrorResponseBody = (HashMap) retrofitException.getErrorBodyAs(); + } } 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 adda01065..62d9e8894 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 @@ -61,7 +61,7 @@ public SpinnakerHttpException(RetrofitException e) { super(e); this.response = null; this.retrofit2Response = e.getResponse(); - responseBody = (Map) e.getErrorBodyAs(HashMap.class); + responseBody = (Map) e.getErrorBodyAs(); this.rawMessage = responseBody != null ? (String) responseBody.getOrDefault("message", e.getMessage())