Skip to content

Commit 1fb95b0

Browse files
committed
Include exception cause as well
1 parent 2759439 commit 1fb95b0

File tree

4 files changed

+38
-8
lines changed

4 files changed

+38
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
2.1.1
5+
------------------
6+
7+
* Messages for `DeserializationException` provide more detail about the involved types when an `IllegalArgumentException` is thrown.
8+
49
2.1.0
510
------------------
611

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,10 @@ private <T> Object decodeMapIntoObject(int size, Class<T> cls)
442442
catch (IllegalArgumentException e){
443443
StringBuilder sbErrors = new StringBuilder();
444444
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());
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());
449449
}
450450
}
451451
throw new DeserializationException("Error creating object of type: " + cls.getSimpleName() + " - " + sbErrors.toString(), e);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.net.InetAddress;
99
import java.nio.ByteBuffer;
1010
import java.util.concurrent.atomic.AtomicReference;
11+
import java.util.Optional;
1112
import java.util.concurrent.ConcurrentHashMap;
1213

1314
/**
@@ -180,7 +181,8 @@ record = this.readNode(buffer, record, bit);
180181
try {
181182
dataRecord = this.resolveDataPointer(buffer, record, cls);
182183
} catch (DeserializationException exception) {
183-
throw new DeserializationException("Error getting record for IP " + ipAddress.toString(), exception);
184+
String msgCause = Optional.ofNullable(exception).map(Exception::getMessage).orElse("");
185+
throw new DeserializationException("Error getting record for IP " + ipAddress.toString() + " - " + msgCause, exception);
184186
}
185187

186188
}

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -568,10 +568,33 @@ public TestModelSubdivision(
568568
}
569569

570570
@Test
571-
public void testDecodeWrongTypeSubdivisions() throws IOException {
571+
public void testDecodeWrongTypeWithConstructorException() throws IOException {
572572
this.testReader = new Reader(getFile("GeoIP2-City-Test.mmdb"));
573573
DeserializationException ex = assertThrows(DeserializationException.class,
574-
() -> this.testReader.get( InetAddress.getByName("2.125.160.216"),TestWrongModelSubdivisions.class));
574+
() -> this.testReader.get( InetAddress.getByName("2.125.160.216"),
575+
TestModelSubdivisionsWithUnknownException.class));
576+
577+
assertThat(ex.getMessage(), containsString("Error getting record for IP /2.125.160.216 - Error creating object"));
578+
}
579+
580+
static class TestModelSubdivisionsWithUnknownException {
581+
List<TestModelSubdivision> subdivisions;
582+
583+
@MaxMindDbConstructor
584+
public TestModelSubdivisionsWithUnknownException (
585+
@MaxMindDbParameter(name="subdivisions")
586+
List<TestModelSubdivision> subdivisions
587+
) throws Exception{
588+
throw new Exception();
589+
}
590+
}
591+
592+
@Test
593+
public void testDecodeWrongTypeWithWrongArguments() throws IOException {
594+
this.testReader = new Reader(getFile("GeoIP2-City-Test.mmdb"));
595+
DeserializationException ex = assertThrows(DeserializationException.class,
596+
() -> this.testReader.get( InetAddress.getByName("2.125.160.216"),
597+
TestWrongModelSubdivisions.class));
575598
assertThat(ex.getMessage(), containsString("Error getting record for IP"));
576599
}
577600

@@ -807,7 +830,7 @@ public void voidTestMapKeyIsString() throws IOException {
807830
TestModelInvalidMap.class
808831
)
809832
);
810-
assertEquals("Error getting record for IP /2.125.160.216", ex.getMessage());
833+
assertEquals("Error getting record for IP /2.125.160.216 - Map keys must be strings.", ex.getMessage());
811834
}
812835

813836
static class TestModelInvalidMap {

0 commit comments

Comments
 (0)