首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在刚刚从RestfulController扩展的rest控制器上使用JSON视图时获取null属性

尝试在刚刚从RestfulController扩展的rest控制器上使用JSON视图时获取null属性
EN

Stack Overflow用户
提问于 2017-03-08 03:32:41
回答 1查看 991关注 0票数 0

我正在尝试json视图,不是在使用@Resource的域类之上,而是通过创建一个RestfulController并尝试使用json视图呈现它。我已经在构建配置中添加了所有相关的依赖项。

我有一个这样的域Post类(我不想直接公开它)

代码语言:javascript
复制
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”,如下所示

代码语言:javascript
复制
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 )。当我使用rest客户端访问url时,我得到了帖子的完整转储(包括持久保存在地图中的评论字段)-这在我的rest客户端中看起来像这样-一切正常

代码语言:javascript
复制
[
  {
"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文件夹的顶部添加json视图

我做了一个非常简单的模板_post.gson,如下所示

代码语言:javascript
复制
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‘来呈现模板

代码语言:javascript
复制
model {
    List<Post> postList
}

//call the template to iterate over the postList to produce the output
json g.render(postList)

这将使用此stracktrace中断服务器,并向rest客户端发送500错误。如果我注释掉与user相关的行in_post.gson,一切都会正常工作。把它留在里面,它就失败了

代码语言:javascript
复制
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时,上面的提示失败了。文档中有一个关于确保您的查询使用fetch join拉取ref的说明-所以我尝试提供一个覆盖,以确保我返回fetch join -我得到的所有内容都是空的,返回给客户端

代码语言:javascript
复制
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视图时,我无法获得包括引用在内的输出。我检查了列表请求,它在调试器中成功返回列表-但在呈现过程中中断

如果我能让它工作,那么在grails 3.2.6上的json视图看起来相当不错。

有没有人知道为什么它会崩溃?

EN

回答 1

Stack Overflow用户

发布于 2017-03-08 18:55:48

Aaargh -我认为这个问题是在jsonViews 1.1.5上的-它还没有为Java8 LocalDateTime做好准备。

我在stackoverflow see topic上看到一个踪迹

hibernate现在将在你的域类中接受localdateTime --这是可行的。但是json模板不会渲染,即使你添加了java8插件。

因此,我回到域类,将我的LocalDateTime改回最新,还将json模板更改为使用较旧的SimpleDateTime格式(而不是DateTimeFormatter),然后重新运行,看看它是否正常工作。

当我们可以说grails已经完全准备好java8时,我会非常高兴的。

显然,json视图需要在json视图2中启用特性(我现在认为这是一个M2 )-所以在此之前我不得不恢复到Java7日期。

天哪,又一个迷失在杂草中的日子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42656774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档