当前位置: 首页 > 知识库问答 >
问题:

Play框架1.2.5中的GSON错误

饶承宣
2023-03-14

这个bug似乎是一个递归bug,公司要求工作表,而工作表又要求公司,这……你就明白了。我已经在互联网和堆栈溢出中搜索了这个问题,我发现了错误发生的原因,但解决方案始终是编写自己的解析器或使用flexjson或其他方法。我只是想知道是否有解决办法,这必须是因为游戏很受欢迎,人们肯定会在一次操作中获取帖子和评论,或者不是吗?

必须有一个解决方案,不需要替换掉json解析器或编写自己的解析器。

公司.java

package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;

@Entity
public class Company extends Model {
    public String name;
    public String address;
    public String city;
    public String zipcode;
    public String country;
    public String phonenumber;
    public String website;
    public String footer;
    public String maincontactperson;
    public String email;
    public String password;
    public Blob logo;
    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
    public List<Worksheet> worksheets;


    }

}

工作表.java

package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;

@Entity
public class Worksheet extends Model {
    public String contactname;
    public String name;
    public String address;
    public String phonenumber;
    public String city;
    public String email;
    public String partnumber;
    @Lob
    public String partdescription;
    public String password;
    public Date due_date;
    public Date in_date;
    @Lob
    public String notes;
    @ManyToOne(cascade=CascadeType.ALL)
    public Company company;
...
}

在我的控制器中,我只运行以下命令:

List<Company> companies = Company.FindAll();
renderJSON(companies);

如果没有工作表,这是有效的,但一旦有了工作表,它就会崩溃,并显示一英里长的错误消息。下面是它的顶部:

00:31:02,623 ERROR ~ 

@6cbn7gi1o
Internal Server Error (500) for request POST /companies/login

Execution exception
InvocationTargetException occured : null

play.exceptions.JavaExecutionException
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:239)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.reflect.InvocationTargetException
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
    ... 1 more
Caused by: java.lang.StackOverflowError
    at java.util.Date.getTimeImpl(Date.java:870)
    at java.util.Date.getTime(Date.java:866)
    at java.sql.Timestamp.getTime(Timestamp.java:126)
    at java.util.Calendar.setTime(Calendar.java:1076)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:875)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:868)
    at java.text.DateFormat.format(DateFormat.java:316)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:90)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:41)
    at com.google.gson.internal.bind.TypeAdapters$22$1.write(TypeAdapters.java:522)
    at com.google.gson.internal.bind.TypeAdapters$22$1.write(TypeAdapters.java:515)
....

    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:879)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)

共有2个答案

屠嘉勋
2023-03-14

在另一个问题中,我找到了指向该类的链接,它似乎很好地解决了循环引用问题(并且没有修改模型类)。

有关示例,请参阅链接问题的批准答案。

西门振
2023-03-14

IMHO这不是一个bug,您的模型中有一个递归,框架无法自动知道它应该如何序列化模型。

我通常用@Expose注释来解决这个问题。将它添加到您希望在序列化JSON中显示的所有成员中,并创建一个helper方法,其功能如下:

    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    String json = gson.toJson(your_model_instance);

或者,您也可以按照注释中的建议实现JsonSerializer接口。

 类似资料:
  • 我需要为以下语法添加路由: 在routes文件中,我尝试使用以下命令 然而,上面的代码并没有捕获URL,而是转到配置中的另一个处理程序(位于select/{term}: 任何关于修复或故障排除的想法将是最受欢迎的。谢谢

  • 我正在使用Play框架1.2.5和Hibernate3.25来开发我的Web应用程序。我遇到应用程序启动问题,速度很慢:( 对于任何JavaEE servlet驱动的应用程序,我们使用来初始化会话工厂(这确实是一项耗时的工作),一旦部署了应用程序,会话工厂就会被初始化,并且所有这一切都必须在应用程序准备好为最终用户使用之前完成。这样,当用户触发第一个请求时,第一个请求的响应时间更快。 但是,对于P

  • 我正在尝试将Olark集成到我的应用程序中。为此,我必须在结束正文标记之前将其放入我的超文本标记语言中: 所以我把这个放在我的观点中。但是,得到的只是 整个脚本正在转换为一个 /。通过查看Play的文档,我看不出是什么原因造成的。有什么提示吗? 转义开始于

  • 而是使用EventStream而不是ArchivedEventStream,当我运行命令alert(通知)消息时,会转到除原始发件人之外的所有连接套接字,我也可以如何发送到原始发件人。 这是我的模型和控制器,使用WebSocket 事件模型 这是控制器

  • **编程对象,Settings.UseJavaCP.Value=true。 Build.Scala

  • 问题内容: 我正在尝试使用Play的自动绑定功能,但没有成功。我正在Eclipse 4.4 Luna上用Java开发。 这是我的表格: 这是我的课程“用户”: 这是我的控制器: 我不知道为什么自动绑定值不起作用。我已经确保表单中的字段名称与类中的属性名称相对应,这对于表单绑定起作用就足够了,对吗? 我正在使用Eclipse Luna,并且关闭了自动项目构建(我从控制台手动进行)。我知道有时候Ecl