【问题标题】:java.lang.StackOverflowError at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)java.lang.StackOverflowError 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
【发布时间】:2016-11-30 07:13:14
【问题描述】:

我正在我的 Android 应用中实现“RealM”。我在“改造库”的帮助下通过调用服务来获取 JSON 数据。

我的模型类是--

public class Game extends RealmObject
{
    @Expose
    @SerializedName("gameID")
    @PrimaryKey
    private int gameID;
    @Expose
    @SerializedName("gameName")
    private String gameName;
    @Expose
    @SerializedName("gameFormat")
    private String gameFormat;
    @Expose
    @SerializedName("gameType")
    private String gameType;
    @Expose
    @SerializedName("imageUrl")
    private String imageUrl;

    public Game() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Game(int gameID, String gameName, String gameFormat, String gamType, String imageUrl) {
        super();
        this.gameID = gameID;
        this.gameName = gameName;
        this.gameFormat = gameFormat;
        this.gameType = gamType;
        this.imageUrl = imageUrl;
    }

    public int getGameID() {
        return gameID;
    }

    public void setGameID(int gameID) {
        this.gameID = gameID;
    }

    public String getGameName() {
        return gameName;
    }

    public void setGameName(String gameName) {
        this.gameName = gameName;
    }

    public String getGameFormat() {
        return gameFormat;
    }

    public void setGameFormat(String gameFormat) {
        this.gameFormat = gameFormat;
    }

    public String getGameType() {
        return gameType;
    }

    public void setGameType(String gamType) {
        this.gameType = gamType;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
}

以下是我处理请求的 OnfieldAPI 接口--

 public interface OnfieldAPI 
{

    Globals global=Globals.getInstance();
    String email=global.getUserName();

    @POST("games")
    Call<GamesResponse> getactivegames(@Header("authtoken") String authtoken);
}

这就是我调用网络服务以获取游戏响应的方式--

public void requestAllgames() {
        Globals globals = Globals.getInstance();
        loading.setVisibility(View.VISIBLE);
        Retrofit newRetro = new Retrofit.Builder()
                .baseUrl(globals.getBaseAddress())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        OnfieldAPI loginCheckApi = newRetro.create(OnfieldAPI.class);
        Call<GamesResponse> callPOST = loginCheckApi.getactivegames(globals.getToken());
        callPOST.enqueue(new Callback<GamesResponse>() {
            @Override
            public void onResponse(Call<GamesResponse> call, Response<GamesResponse> response) {

               // My Success code here.

            }

            @Override
            public void onFailure(Call<GamesResponse> call, Throwable t)
            {
                // My Failure Code Here
            }
        });
    }

下面是我的“GamesResponse”课程

public class GamesResponse {

    @SerializedName("status")
    @Expose
    private Integer status;
    @SerializedName("msg")
    @Expose
    private String msg;
    @SerializedName("payload")
    @Expose
    private List<Game> payload = new ArrayList<Game>();

    /**
     * No args constructor for use in serialization
     *
     */
    public GamesResponse() {
    }

    /**
     *
     * @param status
     * @param payload
     * @param msg
     */
    public GamesResponse(Integer status, String msg, List<Game> payload) {
        this.status = status;
        this.msg = msg;
        this.payload = payload;
    }

    /**
     *
     * @return
     * The status
     */
    public Integer getStatus() {
        return status;
    }

    /**
     *
     * @param status
     * The status
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     *
     * @return
     * The msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     *
     * @param msg
     * The msg
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     *
     * @return
     * The payload
     */
    public List<Game> getPayload() {
        return payload;
    }

    /**
     *
     * @param payload
     * The payload
     */
    public void setPayload(List<Game> payload) {
        this.payload = payload;
    }
}

但是,当我每次运行我的应用程序时都会遇到以下错误。以下是我的完整错误日志--

 java.lang.StackOverflowError at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)                                                                                at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:358)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:158)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTy

我在谷歌上搜索了这个错误,但还没有找到解决方案,所以对于这个问题的任何帮助将不胜感激。也让我知道我是否可以提供更多信息。谢谢你。

【问题讨论】:

  • 您使用的是旧版本的 Realm 吗?在这种情况下,您需要一个自定义类型适配器,如下所述:realm.io/docs/java/0.88.0/#gson
  • @ChristianMelchior 我正在使用 'io.realm:realm-android:0.82.1' 依赖项
  • 那你需要添加我链接的自定义排除策略。
  • 你为什么使用 0.82.1?它非常非常古老,甚至远不及 0.88.3 或更稳定的 1.1.1。你的想法是从 Ravi Tamada 那里得到的吗?那个教程比没有教程还糟糕。

标签: android gson realm retrofit


【解决方案1】:

两种解决方案:

1.) 更新到非古老的 ​​Realm 版本,例如 1.2.0

更多信息可以在我的教程/文章中找到,也可以在my profile page上找到:

2.) 添加此排除策略

Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getDeclaringClass().equals(RealmObject.class);
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }
})
.create();

【讨论】:

  • 请让我知道我在哪个文件中添加上面的代码..?
  • 从技术上讲,您在创建 Gson 实例时需要它。你在某处有Gson gson = new Gson(),你应该用这个替换它。
  • 第一个解决方案,即“1.)更新到不古老的 Realm 版本,例如 1.2.0”对我有用。我将 Realm 版本更新到 2.2.0。
  • 我倾向于推荐 1.2.0 而不是 2.x,因为 2.x 分支还不支持黑莓设备。
【解决方案2】:

很高兴也能看到这个 GameResponse 类。

我不是 100% 确定,但在我看来这是由扩展 RealmObject 引起的。尝试删除此继承以进行测试,然后启动改造请求。如果一切正常,或者您将出现其他异常(例如解析),我们将 100% 确定 RealmObject 对此负责。

然后您将需要有两个单独的类:一个用于 JSON 表示,第二个用于使用 Realm 进行持久性。当然,您将需要一些映射器类来转换 JSON -> 领域和反向。

编辑

其他方式(而不是映射 JSON 表示类和 RealmObject 子类)是为 Retrofit 中使用的 GSON 创建自己的 TypeAdapter(当然,如果您正在使用它)。一些参考链接:

【讨论】:

  • @Pawal Urbal 是的,你说得对,这是因为扩展了 RealmObject。对于“GamesResponse”类请检查我更新的问题。
  • @DnyaneshM GameResponse 类看起来不错,我认为这不是问题所在。所以 - 你必须实现 2 层 - JSON 和 Realm 并引入映射器。其他方法是为 Retrofit 中使用的 Gson 实现自定义 TypeAdapter:github.com/realm/realm-java/issues/696realm.io/docs/java/latest/#gson 供参考。
【解决方案3】:

它看起来是在序列化过程中发生的。 检查此要点以进行正确设置:https://gist.github.com/cmelchior/ddac8efd018123a1e53a

【讨论】:

    【解决方案4】:
     public interface OnfieldAPI 
    {
    Globals global=Globals.getInstance();
    String email=global.getUserName();
    @FormUrlEncoded
    @POST("games")
    Call<GamesResponse> getactivegames(@Header("authtoken") String authtoken);
    }
    

    添加

    @FormUrlEncoded
    

    【讨论】:

    • 他没有在请求正文中发送任何参数,仅发送标头。在这种情况下,添加 @FormUrlEncoded 不会有任何改变。
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多