From 5412f21431ebace2295e933fa0446adc0abf4b01 Mon Sep 17 00:00:00 2001 From: inder123 Date: Wed, 19 Apr 2017 17:08:21 -0700 Subject: [PATCH] Printing more debugging information to help track an invalid JsonAdapter. (#1068) Now the thrown exception carries this information: java.lang.IllegalArgumentException: Invalid attempt to bind an instance of java.lang.Integer as a @JsonAdapter for com.google.gson.functional.JsonAdapterAnnotationOnClassesTest$D. @JsonAdapter value must be a TypeAdapter, TypeAdapterFactory, JsonSerializer or JsonDeserializer. --- gson/src/main/java/com/google/gson/JsonObject.java | 1 + .../bind/JsonAdapterAnnotationTypeAdapterFactory.java | 7 ++++--- .../JsonAdapterAnnotationOnClassesTest.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gson/src/main/java/com/google/gson/JsonObject.java b/gson/src/main/java/com/google/gson/JsonObject.java index 415de6ad..97e7dcf4 100644 --- a/gson/src/main/java/com/google/gson/JsonObject.java +++ b/gson/src/main/java/com/google/gson/JsonObject.java @@ -136,6 +136,7 @@ public final class JsonObject extends JsonElement { * Returns a set of members key values. * * @return a set of member keys as Strings + * @since 2.8.1 */ public Set keySet() { return members.keySet(); diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java b/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java index 7cfb910a..13a7bb7e 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java +++ b/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java @@ -68,9 +68,10 @@ public final class JsonAdapterAnnotationTypeAdapterFactory implements TypeAdapte : null; typeAdapter = new TreeTypeAdapter(serializer, deserializer, gson, type, null); } else { - throw new IllegalArgumentException( - "@JsonAdapter value must be TypeAdapter, TypeAdapterFactory, " - + "JsonSerializer or JsonDeserializer reference."); + throw new IllegalArgumentException("Invalid attempt to bind an instance of " + + instance.getClass().getName() + " as a @JsonAdapter for " + type.toString() + + ". @JsonAdapter value must be a TypeAdapter, TypeAdapterFactory," + + " JsonSerializer or JsonDeserializer."); } if (typeAdapter != null && annotation.nullSafe()) { diff --git a/gson/src/test/java/com/google/gson/functional/JsonAdapterAnnotationOnClassesTest.java b/gson/src/test/java/com/google/gson/functional/JsonAdapterAnnotationOnClassesTest.java index b7b29a65..4288bfe3 100644 --- a/gson/src/test/java/com/google/gson/functional/JsonAdapterAnnotationOnClassesTest.java +++ b/gson/src/test/java/com/google/gson/functional/JsonAdapterAnnotationOnClassesTest.java @@ -249,4 +249,15 @@ public final class JsonAdapterAnnotationOnClassesTest extends TestCase { return Foo.valueOf(in.nextString().toUpperCase(Locale.US)); } } + + public void testIncorrectJsonAdapterType() { + try { + new Gson().toJson(new D()); + fail(); + } catch (IllegalArgumentException expected) {} + } + @JsonAdapter(Integer.class) + private static final class D { + @SuppressWarnings("unused") final String value = "a"; + } }