2

null 文字列値に対処するための moshi アダプターを作成しました。

public class NullStringAdapter {
    @FromJson
    public String stringFromJson(@Nullable String value) {
        if (value.equals(null)) {
            return "nulled";
        }
        return value;
    }
}

それを使用して Moshi インスタンスを作成し、レトロフィットに追加しました。

Moshi moshi = new Moshi.Builder().add(new NullStringAdapter()).build();
Retrofit.Builder().baseUrl(baseURL)
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .client(client)
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

}

実行時に、MoshiAdapterMethodsFactory の繰り返しメソッドから StackOverflowError を取得します。

 Caused by: java.lang.StackOverflowError: stack size 1038KB
                  at com.squareup.moshi.Moshi.cacheKey(Moshi.java:140)
                  at com.squareup.moshi.Moshi.adapter(Moshi.java:69)
 at com.squareup.moshi.AdapterMethodsFactory$5.fromJson(AdapterMethodsFactory.java:212)
 at com.squareup.moshi.AdapterMethodsFactory$1.fromJson(AdapterMethodsFactory.java:81)     
 at com.squareup.moshi.AdapterMethodsFactory$5.fromJson(AdapterMethodsFactory.java:212)
 at com.squareup.moshi.AdapterMethodsFactory$1.fromJson(AdapterMethodsFactory.java:81)     
 at com.squareup.moshi.AdapterMethodsFactory$5.fromJson(AdapterMethodsFactory.java:212)
 at com.squareup.moshi.AdapterMethodsFactory$1.fromJson(AdapterMethodsFactory.java:81)

.... 等々。

問題のある 2 つのコード領域は 212 行目です。

@Override public Object fromJson(Moshi moshi, JsonReader reader)
        throws IOException, IllegalAccessException, InvocationTargetException {
      JsonAdapter<Object> delegate = moshi.adapter(parameterTypes[0], qualifierAnnotations);
      *****Object intermediate = delegate.fromJson(reader);*****
      return method.invoke(adapter, intermediate);
    }

そして81行目:

@Override public Object fromJson(JsonReader reader) throws IOException {
    if (fromAdapter == null) {
      return delegate.fromJson(reader);
    } else if (!fromAdapter.nullable && reader.peek() == JsonReader.Token.NULL) {
      reader.nextNull();
      return null;
    } else {
      try {
        *****return fromAdapter.fromJson(moshi, reader);*****
      } catch (IllegalAccessException e) {
        throw new AssertionError();
      } catch (InvocationTargetException e) {
        if (e.getCause() instanceof IOException) throw (IOException) e.getCause();
        throw new JsonDataException(e.getCause() + " at " + reader.getPath());
      }
    }
  }

メソッドファクトリがこれらのメソッドを際限なく生成するのはなぜですか?

4

1 に答える 1