【问题标题】:Android M + Retrofit + JSON : Can't make field constructor accessibleAndroid M + Retrofit + JSON:无法使字段构造函数可访问
【发布时间】:2015-09-07 04:50:35
【问题描述】:

我目前正在检查我的应用是否支持 M。当我通过改造进行 API 调用时出现此错误。这似乎是我得到的一个 json 错误。还有其他人遇到过吗?这是我的 JSON 助手类。

public class JsonHelper {

    private static final String JSON_PARSE_ERROR = "Unable to parse JSON: ";
    private static Gson sGson;
    private static Gson sExposeGson;

    static {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapterFactory(new EnumTypeAdapterFactory());
        builder.registerTypeAdapter(BlogCategoryDto.class, new BlogCategorySerializer());
        ...

        sGson = builder.create();

        builder.excludeFieldsWithoutExposeAnnotation();
        sExposeGson = builder.create();
    }

    public static Gson getGson() {
        return sGson;
    }

    public static Gson getsExposeGsonGson() {
        return sExposeGson;
    }

    public static String toJson(@NonNull Object object) {
        return sGson.toJson(object);
    }

    public static String toJson(@NonNull Object object, @NonNull Type type) {
        return sGson.toJson(object, type);
    }

    public static String toExposeJson(@NonNull Object object) {
        return sExposeGson.toJson(object);
    }

    public static String toExposeJson(@NonNull Object object, @NonNull Type type) {
        return sExposeGson.toJson(object, type);
    }

    public static <T> T fromJson(@NonNull String content, @NonNull Class<T> clazz)
            throws IllegalStateException {
        try {
            return sGson.fromJson(content, clazz);
        } catch (JsonSyntaxException e) {
            throw new IllegalStateException(JSON_PARSE_ERROR + content, e);
        }
    }

    public static <T> T fromJson(@NonNull String content, @NonNull Type type)
            throws IllegalStateException {
        try {
            return sGson.fromJson(content, type);
        } catch (JsonSyntaxException e) {
            throw new IllegalStateException(JSON_PARSE_ERROR + content, e);
        }
    }
}

这是抛出的错误

D/Retrofit﹕java.lang.SecurityException: Can't make field constructor accessible
        at java.lang.reflect.Constructor.setAccessible(Constructor.java:334)
        at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:97)
        at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:79)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:82)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:52)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:52)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83)
        at com.google.gson.Gson.getAdapter(Gson.java:359)
        at com.google.gson.Gson.fromJson(Gson.java:809)
        at com.google.gson.Gson.fromJson(Gson.java:775)
        at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367)
        at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
        at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
        at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at retrofit.Platform$Android$2$1.run(Platform.java:142)
        at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • Gson 项目中已经存在一个问题:github.com/google/gson/issues/648
  • 不会自动改造包含 Gson 吗?为什么要使用自定义的 Json 工厂?
  • @EfeKahraman 你的权利似乎有问题

标签: android json retrofit


【解决方案1】:

正如 cmets 中指出的那样,Gson 项目中已经存在一个问题。

https://github.com/google/gson/issues/648

因此,等到他们更新他们的库似乎是个好主意。与此同时,我可以通过添加一行代码来快速修复。

static {
    GsonBuilder builder = new GsonBuilder();

    ...

    builder.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC);**
    builder.excludeFieldsWithoutExposeAnnotation();
    sExposeGson = builder.create();
}

【讨论】:

  • 我已经尝试过了,现在它没有崩溃,但它给了我对象中的所有空值,因为真正的 JSON 响应中有非空值。有什么想法吗?
  • 因为你的模型没有@Expose注解
  • 如果没有必要,删除 builder.excludeFieldsWithoutExposeAnnotation();
【解决方案2】:

这对我有用。希望这可以帮助某人。

GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC);
Gson gson = builder.create();

【讨论】:

    【解决方案3】:

    最好的方法!

      GsonBuilder builder = new GsonBuilder().excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC);
      Gson gson = builder.create();
      Retrofit retrofit = new Retrofit.Builder().baseUrl(URL)
          .addConverterFactory(GsonConverterFactory.create(gson))
          .build();
    

    【讨论】:

      【解决方案4】:

      here 中提到,在 Android M 中使用 Retrofit2 存在问题

      其中一个解决方案是像这样配置 GsonConverterFactory:

      Retrofit retrofit = new Retrofit.Builder()
          .baseUrl(URLWebService)
          .addConverterFactory(GsonConverterFactory.create(
                                 new GsonBuilder()
                                 .excludeFieldsWithoutExposeAnnotation()
                                 .create()
                              ))
          .client(okHttpClient)
          .build(); 
      

      【讨论】:

        猜你喜欢
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        相关资源
        最近更新 更多