我正在尝试json视图,不是在使用@Resource的域类之上,而是通过创建RestfulController并尝试使用json视图来渲染它。我在构建配置中添加了所有相关的依赖项。
我有一个像这样的域Post类(我不想直接暴露)
class Post implements Serializable {
Map comments
User user
Venue venue
String description
Rating rating //should this be an enum?
LocalDateTime dateCreated
LocalDateTime lastUpdated
static belongsTo = [user:User]
static hasOne = [rating:Rating]
static constraints = {
venue nullable:true
comments nullable:true
description nullable:true
rating nullable:true, lazy:false
}
static mapping = {
//set the sort order for Posts - default using newest post first
sort dateCreated :"desc"
}
}
所以我随后创建了一个像这样的默认restfulContoller
class PostRestController extends RestfulController {
static responseFormats = ["json", "xml"]
//constructor - tells rest controller which domain class to scaffold
PostRestController() {
super (Post)
}
}
我没有在这里覆盖任何默认的脚手架方法。
当我使用rest客户端访问默认值时(我在UrlMappings中映射了/api/posts (resources: postRest
)。当我使用我的休息客户端访问网址时,我获得了Post的完整转储(包括地图中保留的评论字段) - 这在我的休息客户端看起来像这样 - 一切正常
[
{
"id": 1,
"comments": {
"view": "lovely"
},
"dateCreated": {
"class": "java.time.LocalDateTime",
"dayOfMonth": 7,
"dayOfWeek": {
"enumType": "java.time.DayOfWeek",
"name": "TUESDAY"
},
"dayOfYear": 66,
"hour": 19,
"minute": 15,
"month": {
"enumType": "java.time.Month",
"name": "MARCH"
},
"monthValue": 3,
"nano": 263000000,
"second": 10,
"year": 2017,
"chronology": {
"calendarType": "iso8601",
"class": "java.time.chrono.IsoChronology",
"id": "ISO"
}
},
"description": null,
"lastUpdated": {
"class": "java.time.LocalDateTime",
"dayOfMonth": 7,
"dayOfWeek": {
"enumType": "java.time.DayOfWeek",
"name": "TUESDAY"
},
"dayOfYear": 66,
"hour": 19,
"minute": 15,
"month": {
"enumType": "java.time.Month",
"name": "MARCH"
},
"monthValue": 3,
"nano": 263000000,
"second": 10,
"year": 2017,
"chronology": {
"calendarType": "iso8601",
"class": "java.time.chrono.IsoChronology",
"id": "ISO"
}
},
"rating": null,
"user": {
"id": 1
},
"venue": null
}
],
然后我尝试在grails-app/views/postRest
文件夹
我做了一个非常简单的模板_post.gson,就像这样
model {
Post post
}
json {
comments post.comments
description post.description
//rating post.rating
userWhoPosted "${post?.user}"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd")
def when = post.dateCreated.format(formatter)
created when
}
然后我添加了一个`index.gson'来渲染模板
model {
List<Post> postList
}
//call the template to iterate over the postList to produce the output
json g.render(postList)
这会破坏服务器这个stracktrace并向其他客户端发出500错误。如果我注释掉与用户有关的行in_post.gson就可以了。保留它并且失败
Caused by: grails.views.ViewRenderException: Error rendering view: null
at grails.views.AbstractWritableScript.writeTo(AbstractWritableScript.groovy:43)
at grails.views.mvc.GenericGroovyTemplateView.renderMergedOutputModel(GenericGroovyTemplateView.groovy:73)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
at grails.views.mvc.renderer.DefaultViewRenderer.render(DefaultViewRenderer.groovy:111)
at grails.artefact.controller.RestResponder$Trait$Helper.internalRespond(RestResponder.groovy:188)
at grails.artefact.controller.RestResponder$Trait$Helper.respond(RestResponder.groovy:62)
at grails.rest.RestfulController.index(RestfulController.groovy:64)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
... 4
如果我注释掉post.user(和评级引用),它可以正常工作。但是当我尝试发布post.user时,它失败了。文档中有一条关于确保您的查询使用获取连接来提取引用的注释 - 所以我尝试提供覆盖以确保我返回了获取连接 - 所有我得到的是空的返回给客户端
class PostRestController extends RestfulController {
static responseFormats = ["json", "xml"]
//constructor - tells rest controller which domain class to scaffold
PostRestController() {
super (Post)
}
def index() {
Collection<Post> res = Post.list([fetch:[user:"join",rating:"join"]])
res
}
}
为什么当我没有json视图的情况下它工作正常,当我使用json视图时,我无法获得包括引用的输出。我检查了列表请求,它在调试器中成功返回列表 - 但是在渲染中断了
如果我可以让这个工作json浏览grails 3.2.6看起来很不错
任何人都有任何想法,为什么会破坏?
答案 0 :(得分:1)
Aaargh - 认为这个问题与jsonViews 1.1.5有关 - 它还没有为java 8 LocalDateTime做好准备。
我在stackoverflow see topic
上看到了一条跟踪hibernate现在将在你的域类中使用localdateTime - 这是有效的。但即使你添加java8插件,json模板渲染也不会。
所以我回到域类中将我的LocalDateTime改回日期,也改变了json模板以使用旧的SimpleDateTime格式(而不是DateTimeFormatter)并重新运行 - 低并且看起来有效。
我们真的很高兴我们可以说grails已经准备好了java8。
显然json视图需要在json视图中使用的功能启用2(现在认为这是一个M2) - 所以我必须在那之前恢复到java 7 Date。
在杂草中又失去了一天。