From 825a69651f2058bb8d09970250078b89dcdbbc80 Mon Sep 17 00:00:00 2001 From: maheshshinde9100 Date: Sat, 31 Jan 2026 00:10:55 +0530 Subject: [PATCH 1/2] Added a safety check in parseResponse to throw a clear RazorpayException if an entity class cannot be found, rather than failing with a NullPointerException --- src/main/java/com/razorpay/ApiClient.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/razorpay/ApiClient.java b/src/main/java/com/razorpay/ApiClient.java index b9c82ce1..03ac52ad 100755 --- a/src/main/java/com/razorpay/ApiClient.java +++ b/src/main/java/com/razorpay/ApiClient.java @@ -118,6 +118,9 @@ else if(response.code()==204){ private T parseResponse(JSONObject jsonObject, String entity) throws RazorpayException { if (entity != null) { Class cls = getClass(entity); + if (cls == null) { + throw new RazorpayException("Unable to find class for entity: " + entity); + } try { return cls.getConstructor(JSONObject.class).newInstance(jsonObject); } catch (Exception e) { @@ -239,7 +242,7 @@ private void throwServerException(int statusCode, String responseBody) throws Ra private Class getClass(String entity) { try { - String entityClass = "com.razorpay." + WordUtils.capitalize(entity, '_').replaceAll("_", ""); + String entityClass = getClass().getPackage().getName() + "." + WordUtils.capitalize(entity, '_').replaceAll("_", ""); return Class.forName(entityClass); } catch (ClassNotFoundException e) { return null; From 711890b5425cef50bcc113835461d3801d9b1722 Mon Sep 17 00:00:00 2001 From: maheshshinde9100 Date: Sat, 31 Jan 2026 00:33:48 +0530 Subject: [PATCH 2/2] fixed dynamic package resolution and modernize build for Java 21 - Resolve response parsing errors in shaded/re-packaged environments (#333) - Update Mockito and Jacoco for modern JDK compatibility - Fix deprecated Mockito matchers in BaseTest --- pom.xml | 20 ++++++++++++-------- src/test/java/com/razorpay/BaseTest.java | 6 +++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 61d95118..78d7c514 100644 --- a/pom.xml +++ b/pom.xml @@ -54,17 +54,11 @@ org.mockito mockito-inline - 2.13.0 - test - - - org.json - json + 4.11.0 test - com.squareup.okhttp3 okhttp @@ -158,7 +152,7 @@ org.jacoco jacoco-maven-plugin - 0.8.7 + 0.8.11 com/razorpay/**/EntityNameURLMapping.class @@ -204,6 +198,16 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + -XX:+EnableDynamicAgentLoading -Dnet.bytebuddy.experimental=true @{argLine} + + + diff --git a/src/test/java/com/razorpay/BaseTest.java b/src/test/java/com/razorpay/BaseTest.java index fde9918f..1f8ce102 100644 --- a/src/test/java/com/razorpay/BaseTest.java +++ b/src/test/java/com/razorpay/BaseTest.java @@ -16,7 +16,7 @@ import java.util.Map; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.anyObject; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -30,7 +30,7 @@ public class BaseTest { @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); + MockitoAnnotations.openMocks(this); mockGetCall(); mockURL(Collections.emptyList()); } @@ -44,7 +44,7 @@ private void mockGetCall() throws IOException, IllegalAccessException { Call call = mock(Call.class); when(call.execute()).thenReturn(mockedResponse); - when(okHttpClient.newCall(anyObject())).thenReturn(call); + when(okHttpClient.newCall(any())).thenReturn(call); }