使用Groovy / Grails为我提供更多初学者问题。
Groovy版本2.4.8 Grails版本2.5.1
我尝试了多种方法来序列化我的一个域类的实例或该域类的实例的ArrayList。
尝试序列化单个实例时,出现堆栈溢出错误。
代码和堆栈跟踪如下所示
def getAdvisors(String keystrokes, String firm) {
def advisors = priceBlotterService.advisorsForKeystrokes(keystrokes, "", 30)
def a1 = advisors[0]
def json = JsonOutput.toJson(a1)
}
Caused by InvocationTargetException: null
->> 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . in java.lang.Thread
Caused by StackOverflowError: null
->> 100 | invoke in org.codehaus.groovy.reflection.CachedMethod
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 62 | getProperty in groovy.lang.MetaBeanProperty
| 42 | getValue in groovy.lang.PropertyValue
| 388 | getProperties in org.codehaus.groovy.runtime.DefaultGroovyMethods
| 290 | writeObject in groovy.json.JsonOutput
| 329 | writeArray in ''
| 286 | writeObject in ''
| 424 | writeMap in ''
| 294 | writeObject in ''
| 329 | writeArray in ''
| 286 | writeObject in ''
| 424 | writeMap in ''
顾问,案例和公司类:
class Advisor {
String firstName
String lastName
String fullName
String city
String state
Firm firm
static belongsTo = [Case, Firm]
static hasMany = [cases:Case]
static constraints = {
}
}
class Case {
String caseCode
String internalComment
String externalComment
Date dateCreated
String createdBy
Date dateUpdated
String updatedBy
static belongsTo = [owner:User, caseStatusType:CaseStatusType]
static hasMany = [advisor:Advisor]
static mapping = {
dateCreated sqlType: "date"
dateUpdated sqlType: "date"
}
static constraints = {
dateCreated(nullabe: false)
dateUpdated(nullable: false)
}
}
class Firm {
String name
static constraints = {
}
}
编辑:
我发现我的域类/表的一个基本问题可能与此有关,需要解决。
我尝试从用户表中进行简单的获取,并收到一条错误消息,指出没有id字段。很难搞清楚发生了什么。一些细节如下。
代码行
User[] users = User.findAll()
错误消息
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not extract ResultSet; bad SQL grammar [n/a]; nested exception is org.postgresql.util.PSQLException: ERROR: column this_.id does not exist Position: 8
用户类
class User {
String firstName
String lastName
static constraints = {
}
}
用户表的ddl
CREATE TABLE "user"
(
id BIGINT DEFAULT nextval('user_id_seq'::regclass) PRIMARY KEY NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
version BIGINT
);
CREATE UNIQUE INDEX user_id_uindex ON "user" (id);
编辑:
使用User表/类修复了发行者。 User是Postresql中的关键字,所以我只是重构为EndUser。
答案 0 :(得分:1)
我怀疑你的数据结构存在一些问题,这导致JSON构建器进入无限循环。
您可能需要查看此内容,了解有关日期问题的信息:https://issues.apache.org/jira/browse/GROOVY-7682
这可能会改为:
import grails.converters.JSON
def json = new JSON(a1)
答案 1 :(得分:0)
我在任何地方都找不到此文档,但是不要将JsonOutput用于域对象。
我刚遇到类似的问题。 DomainObject实例具有称为“ all
”的“整洁”属性,它将返回域对象的每个实例。
当JsonOutput尝试序列化您的对象时,它将使用DefaultGroovyMethods.getProperties,其中包括all
属性。这意味着您的代码将导致休眠状态将Advisor类的每个副本都加载到内存中。
就我而言,我内存不足。我的系统陷入了垃圾回收循环。
在您的情况下,当渲染a1类时,它包括“ all”属性,该属性是所有Advisor的完整列表。每个顾问程序还具有“所有”属性,因此它将尝试呈现每个顾问程序。等等。最终使您的堆栈溢出。