From 4b76bb95268158d74d4cbd317565d7d7f3c6af14 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Sat, 8 Aug 2015 13:19:34 -0400 Subject: [PATCH] Throw a better message attempting to adapt a platform type. --- .../com/squareup/moshi/ClassJsonAdapter.java | 9 +++++- moshi/src/test/java/android/util/Pair.java | 4 +++ .../squareup/moshi/ClassJsonAdapterTest.java | 7 ----- .../java/com/squareup/moshi/MoshiTest.java | 28 +++++++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 moshi/src/test/java/android/util/Pair.java diff --git a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java index b9e428f..4f19e49 100644 --- a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java +++ b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java @@ -35,7 +35,14 @@ final class ClassJsonAdapter extends JsonAdapter { @Override public JsonAdapter create( Type type, Set annotations, Moshi moshi) { Class rawType = Types.getRawType(type); - if (rawType.isInterface() || rawType.isEnum() || isPlatformType(rawType)) return null; + if (rawType.isInterface() || rawType.isEnum()) return null; + if (isPlatformType(rawType)) { + throw new IllegalArgumentException("Platform " + + type + + " annotated " + + annotations + + " requires explicit JsonAdapter to be registered"); + } if (!annotations.isEmpty()) return null; if (rawType.getEnclosingClass() != null && !Modifier.isStatic(rawType.getModifiers())) { diff --git a/moshi/src/test/java/android/util/Pair.java b/moshi/src/test/java/android/util/Pair.java new file mode 100644 index 0000000..ad0902d --- /dev/null +++ b/moshi/src/test/java/android/util/Pair.java @@ -0,0 +1,4 @@ +package android.util; + +public final class Pair { +} diff --git a/moshi/src/test/java/com/squareup/moshi/ClassJsonAdapterTest.java b/moshi/src/test/java/com/squareup/moshi/ClassJsonAdapterTest.java index 66b33f7..97ca825 100644 --- a/moshi/src/test/java/com/squareup/moshi/ClassJsonAdapterTest.java +++ b/moshi/src/test/java/com/squareup/moshi/ClassJsonAdapterTest.java @@ -21,8 +21,6 @@ import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.SimpleTimeZone; -import java.util.UUID; -import javax.crypto.KeyGenerator; import okio.Buffer; import org.junit.Test; @@ -329,11 +327,6 @@ public final class ClassJsonAdapterTest { } } - @Test public void platformClassNotSupported() throws Exception { - assertThat(ClassJsonAdapter.FACTORY.create(UUID.class, NO_ANNOTATIONS, moshi)).isNull(); - assertThat(ClassJsonAdapter.FACTORY.create(KeyGenerator.class, NO_ANNOTATIONS, moshi)).isNull(); - } - @Test public void anonymousClassNotSupported() throws Exception { Comparator c = new Comparator() { @Override public int compare(Object a, Object b) { diff --git a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java index ed4c653..cc07fab 100644 --- a/moshi/src/test/java/com/squareup/moshi/MoshiTest.java +++ b/moshi/src/test/java/com/squareup/moshi/MoshiTest.java @@ -15,6 +15,8 @@ */ package com.squareup.moshi; +import android.util.Pair; +import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; @@ -27,6 +29,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Set; +import javax.crypto.KeyGenerator; import org.junit.Test; import static com.squareup.moshi.TestUtil.newReader; @@ -707,6 +710,31 @@ public final class MoshiTest { } } + @Test public void platformTypeThrows() throws IOException { + Moshi moshi = new Moshi.Builder().build(); + try { + moshi.adapter(File.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage( + "Platform class java.io.File annotated [] requires explicit JsonAdapter to be registered"); + } + try { + moshi.adapter(KeyGenerator.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage( + "Platform class javax.crypto.KeyGenerator annotated [] requires explicit JsonAdapter to be registered"); + } + try { + moshi.adapter(Pair.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage( + "Platform class android.util.Pair annotated [] requires explicit JsonAdapter to be registered"); + } + } + static class Pizza { final int diameter; final boolean extraCheese;