玩!使用JQuery呈现框架示例列表

时间:2011-07-12 19:57:09

标签: jquery playframework getjson

需要一些帮助,我有一个服务器端控制器功能:

public static void getNews(){
    List<Thread> threads = Thread.findAll();
    renderJSON(threads);
}

前端请求:

<script type="text/javascript">
$.getJSON('@{Application.getNews()}', function(threads) {
      var items = [];

      $.each(threads, function(title, text) {
        items.push("<div>" + text + "</div>");
      });
    });
</script>

但它不起作用。控制台例外列表:

Internal Server Error (500) for request GET /application/getnews

Execution exception (In /app/controllers/Application.java around line 43)
IllegalStateException occured : circular reference error   Offending field: thre
ads    Offending object: preserveType: true, type: class models.Thread, obj: Thr
ead[21]

play.exceptions.JavaExecutionException: circular reference error
  Offending field: threads

  Offending object: preserveType: true, type: class models.Thread, obj: Thread[2
1]
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:227)
        at Invocation.HTTP Request(Play!)
Caused by: java.lang.IllegalStateException: circular reference error
  Offending field: threads

  Offending object: preserveType: true, type: class models.Thread, obj: Thread[2
1]
        at com.google.gson.CircularReferenceException.createDetailedException(Ci
rcularReferenceException.java:43)
        at com.google.gson.JsonSerializationVisitor.visitFieldUsingCustomHandler
(JsonSerializationVisitor.java:212)
        at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.j
ava:158)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:131)
        at com.google.gson.JsonSerializationVisitor.getJsonElementForChild(JsonS
erializationVisitor.java:147)
        at com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSeria
lizationVisitor.java:125)
        at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSeriali
zationVisitor.java:112)
        at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.j
ava:164)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:131)
        at com.google.gson.JsonSerializationContextDefault.serialize(JsonSeriali
zationContextDefault.java:56)
        at com.google.gson.JsonSerializationContextDefault.serialize(JsonSeriali
zationContextDefault.java:49)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.serialize(D
efaultTypeAdapters.java:528)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.serialize(D
efaultTypeAdapters.java:510)
        at com.google.gson.JsonSerializationVisitor.findAndInvokeCustomSerialize
r(JsonSerializationVisitor.java:184)
        at com.google.gson.JsonSerializationVisitor.visitUsingCustomHandler(Json
SerializationVisitor.java:160)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
        at com.google.gson.JsonSerializationContextDefault.serialize(JsonSeriali
zationContextDefault.java:56)
        at com.google.gson.Gson.toJsonTree(Gson.java:233)
        at com.google.gson.Gson.toJson(Gson.java:273)
        at com.google.gson.Gson.toJson(Gson.java:253)
        at play.mvc.results.RenderJson.<init>(RenderJson.java:20)
        at play.mvc.Controller.renderJSON(Controller.java:325)
        at controllers.Application.getNews(Application.java:43)
        at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:540)

        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:498)
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:474)

        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:469)

        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:157)
        ... 1 more
Caused by: com.google.gson.CircularReferenceException: circular reference error
        at com.google.gson.JsonSerializationVisitor.start(JsonSerializationVisit
or.java:56)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:114)
        at com.google.gson.JsonSerializationContextDefault.serialize(JsonSeriali
zationContextDefault.java:56)
        at com.google.gson.JsonSerializationContextDefault.serialize(JsonSeriali
zationContextDefault.java:49)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.serialize(D
efaultTypeAdapters.java:528)
        at com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter.serialize(D
efaultTypeAdapters.java:510)
        at com.google.gson.JsonSerializationVisitor.findAndInvokeCustomSerialize
r(JsonSerializationVisitor.java:184)
        at com.google.gson.JsonSerializationVisitor.visitFieldUsingCustomHandler
(JsonSerializationVisitor.java:203)
        ... 27 more

2 个答案:

答案 0 :(得分:2)

这是GSON中Play的默认JSON引擎的一个问题。切换到Flex.JSON

解决您的确切问题 - http://www.lunatech-research.fr/archives/2011/04/20/play-framework-better-json-serialization-flexjson

答案 1 :(得分:0)

试试这个。

在网址中放置一条简单的路线

JS URL ref '路线/'

在路径conf文件中添加this,其中method是控制器函数的名称。

GET route / controllers.Application.method()

那应该有所帮助。