diff --git a/pom.xml b/pom.xml
index e956024..6641942 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,8 +47,8 @@
3.20.0
2.0.62
- 31.0.1-jre
- 2.22.1
+ 33.8.0-jre
+ 2.18.12
6.1.0
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));
+ }
+}