diff --git a/pom.xml b/pom.xml index e79574b..b5063ae 100644 --- a/pom.xml +++ b/pom.xml @@ -47,8 +47,8 @@ 3.20.0 2.0.62 - 32.0.0-jre - 2.18.9 + 33.8.0-jre + 2.18.12 5.11.4 1.18.46 4.9.3 diff --git a/src/main/java/com/faceplusplus/spring/boot/FaceppOkHttp3Template.java b/src/main/java/com/faceplusplus/spring/boot/FaceppOkHttp3Template.java index a29130b..42afaac 100755 --- a/src/main/java/com/faceplusplus/spring/boot/FaceppOkHttp3Template.java +++ b/src/main/java/com/faceplusplus/spring/boot/FaceppOkHttp3Template.java @@ -862,6 +862,6 @@ public ObjectMapper getObjectMapper() { } private T safeInstantiate(Class cls) { - try { return safeInstantiate(cls); } catch (Exception e) { return null; } + try { return cls.getDeclaredConstructor().newInstance(); } catch (ReflectiveOperationException | SecurityException e) { return null; } } } diff --git a/src/test/java/com/faceplusplus/spring/boot/FaceppOkHttp3TemplateTest.java b/src/test/java/com/faceplusplus/spring/boot/FaceppOkHttp3TemplateTest.java index 37530b1..f43ef80 100644 --- a/src/test/java/com/faceplusplus/spring/boot/FaceppOkHttp3TemplateTest.java +++ b/src/test/java/com/faceplusplus/spring/boot/FaceppOkHttp3TemplateTest.java @@ -147,11 +147,9 @@ void shouldReadValueFromJson() { } @Test - void shouldThrowOnInvalidJsonDueToRecursiveSafeInstantiate() { + void shouldReturnDefaultResponseOnInvalidJson() { String json = "invalid json"; - assertThrows(StackOverflowError.class, () -> { - template.readValue(json, FaceppResponse.class); - }); + assertNotNull(template.readValue(json, FaceppResponse.class)); } // Test various doRequest overloads diff --git a/src/test/java/com/faceplusplus/spring/boot/ResponseFallbackTest.java b/src/test/java/com/faceplusplus/spring/boot/ResponseFallbackTest.java new file mode 100644 index 0000000..4b75058 --- /dev/null +++ b/src/test/java/com/faceplusplus/spring/boot/ResponseFallbackTest.java @@ -0,0 +1,33 @@ +package com.faceplusplus.spring.boot; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.faceplusplus.spring.boot.resp.FaceppResponse; +import okhttp3.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +class ResponseFallbackTest { + private FaceppOkHttp3Template template(int code, String body) { + OkHttpClient client = new OkHttpClient.Builder().addInterceptor(chain -> new Response.Builder() + .request(chain.request()).protocol(Protocol.HTTP_1_1).code(code).message("test") + .body(ResponseBody.create(MediaType.parse("application/json"), body)).build()).build(); + return new FaceppOkHttp3Template(client, new ObjectMapper(), new FaceppProperties()); + } + @Test void invalidJsonReturnsDefaultResponse() throws Exception { + FaceppResponse result = template(200,"invalid json").get("http://localhost/test",FaceppResponse.class); + assertNotNull(result); assertEquals(200,result.getCode()); + } + @Test void unsuccessfulHttpReturnsStatus() throws Exception { + FaceppResponse result = template(503,"unavailable").get("http://localhost/test",FaceppResponse.class); + assertNotNull(result); assertEquals(503,result.getCode()); + } + @Test void successfulResponsePreservesFields() throws Exception { + FaceppResponse result = template(200,"{\"request_id\":\"local-test\"}").get("http://localhost/test",FaceppResponse.class); + assertEquals(200,result.getCode()); assertEquals("local-test",result.getRequestId()); + } + public abstract static class AbstractResponse extends FaceppResponse {} + public static class NoDefaultResponse extends FaceppResponse { public NoDefaultResponse(String value) {} } + @Test void unconstructibleResponsesReturnNull() throws Exception { + assertNull(template(503,"bad").get("http://localhost/test",AbstractResponse.class)); + assertNull(template(503,"bad").get("http://localhost/test",NoDefaultResponse.class)); + assertNull(template(200,"bad").readValue("bad",AbstractResponse.class)); + } +}