Skip to content

Commit 2759439

Browse files
committed
Add exception for argument mismatch in contructor
1 parent 7924fb6 commit 2759439

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

src/main/java/com/maxmind/db/Decoder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,17 @@ private <T> Object decodeMapIntoObject(int size, Class<T> cls)
439439
InvocationTargetException e) {
440440
throw new DeserializationException("Error creating object: " + e.getMessage(), e);
441441
}
442+
catch (IllegalArgumentException e){
443+
StringBuilder sbErrors = new StringBuilder();
444+
for (String key : parameterIndexes.keySet()) {
445+
int index= parameterIndexes.get(key);
446+
if ( !parameters[index].getClass().isAssignableFrom( parameterTypes[index])){
447+
sbErrors.append(" argument type mismatch in " + key + " MMDB Type: "+ parameters[index].getClass().getCanonicalName()
448+
+" Java Type: " +parameterTypes[index].getCanonicalName());
449+
}
450+
}
451+
throw new DeserializationException("Error creating object of type: " + cls.getSimpleName() + " - " + sbErrors.toString(), e);
452+
}
442453
}
443454

444455
private static <T> Constructor<T> findConstructor(Class<T> cls)

src/main/java/com/maxmind/db/Reader.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,12 @@ record = this.readNode(buffer, record, bit);
177177
T dataRecord = null;
178178
if (record > nodeCount) {
179179
// record is a data pointer
180-
dataRecord = this.resolveDataPointer(buffer, record, cls);
180+
try {
181+
dataRecord = this.resolveDataPointer(buffer, record, cls);
182+
} catch (DeserializationException exception) {
183+
throw new DeserializationException("Error getting record for IP " + ipAddress.toString(), exception);
184+
}
185+
181186
}
182187

183188
return new DatabaseRecord<>(dataRecord, ipAddress, pl);

src/test/java/com/maxmind/db/ReaderTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,38 @@ public TestModelSubdivision(
567567
}
568568
}
569569

570+
@Test
571+
public void testDecodeWrongTypeSubdivisions() throws IOException {
572+
this.testReader = new Reader(getFile("GeoIP2-City-Test.mmdb"));
573+
DeserializationException ex = assertThrows(DeserializationException.class,
574+
() -> this.testReader.get( InetAddress.getByName("2.125.160.216"),TestWrongModelSubdivisions.class));
575+
assertThat(ex.getMessage(), containsString("Error getting record for IP"));
576+
}
577+
578+
static class TestWrongModelSubdivisions {
579+
List<TestWrongModelSubdivision> subdivisions;
580+
581+
@MaxMindDbConstructor
582+
public TestWrongModelSubdivisions (
583+
@MaxMindDbParameter(name="subdivisions")
584+
List<TestWrongModelSubdivision> subdivisions
585+
) {
586+
this.subdivisions = subdivisions;
587+
}
588+
}
589+
590+
static class TestWrongModelSubdivision {
591+
Integer uint16Field;
592+
@MaxMindDbConstructor
593+
public TestWrongModelSubdivision(
594+
@MaxMindDbParameter(name="iso_code")
595+
Integer uint16Field
596+
) {
597+
this.uint16Field = uint16Field;
598+
;
599+
}
600+
}
601+
570602
@Test
571603
public void testDecodeConcurrentHashMap() throws IOException {
572604
this.testReader = new Reader(getFile("GeoIP2-City-Test.mmdb"));
@@ -775,7 +807,7 @@ public void voidTestMapKeyIsString() throws IOException {
775807
TestModelInvalidMap.class
776808
)
777809
);
778-
assertEquals("Map keys must be strings.", ex.getMessage());
810+
assertEquals("Error getting record for IP /2.125.160.216", ex.getMessage());
779811
}
780812

781813
static class TestModelInvalidMap {

0 commit comments

Comments
 (0)