Grails 3.2 JSON 视图中的 Java 8 LocalDate

Posted

技术标签:

【中文标题】Grails 3.2 JSON 视图中的 Java 8 LocalDate【英文标题】:Java 8 LocalDate in Grails 3.2 JSON view 【发布时间】:2017-04-24 16:47:31 【问题描述】:

当我尝试使用 json view 解析包含 Java 8 LocalDateTime 的简单域模型对象时,我收到堆栈溢出异常,这似乎与 GSON 实现不了解 Java 8 LocalDateTime 的事实有关.

这是一个示例 (documentation of grails views and JSON):

域类“人”

import java.time.LocalDate
class Person

    Sting name
    LocalDate birthDate

人员控制器

class PersonController

    def index() 
        respond Person.findAll() as List<Person>
    

index.gson 视图

@Field List<Person> personList

json tmpl.person(personList)

_person.gson 模板文件

model 

   Person person


json g.parse(person)

当我尝试打开这个视图时,会抛出堆栈溢出异常:

原因:grails.views.ViewRenderException:错误渲染视图: 空值 在 grails.views.AbstractWritableScript.writeTo(AbstractWritableScript.groovy:43) 在 grails.plugin.json.view.api.internal.DefaultGrailsJsonViewHelper$6.writeTo(DefaultGrailsJsonViewHelper.groovy:677)

当我将 _person.gson 简化为:

...
json 

   name person.name

视图按预期工作。

我的问题是

是否有默认方式来处理 Grails JSON 视图中的 Java 8 LocalDate/Time 属性? 如果没有,我怎么能register a new GSON builder permanently


这个问题相关:How to serialize and deserialize Java 8's java.time types with Gson? 我尝试实现这个:https://github.com/gkopff/gson-javatime-serialisers,但这不会将自己注入为新的默认反序列化器,需要手动使用

【问题讨论】:

您使用的是什么版本的 JSON 视图?更新的版本添加了 Java 8 日期支持 您好@GraemeRocher,感谢您的反馈。我完全不使用 JSON 视图,为我解决了这个问题。可悲的是。但也许这个线程可以用于遇到这个问题的其他人。我在使用这个 maven 包时遇到了上述问题:org.grails.plugins:views-json:1.2.0.M2 您可能需要将plugins.grails.org/plugin/grails-java8 添加到您的类路径 好点。我不知道这个插件,因为上面的错误发生了,所以它不存在。感谢您的意见。 【参考方案1】:

这些 java 8 日期支持尚未在 json 视图中实现。这将适用于视图 1.2.0(发布时)和当时最新版本的 grails-java8 插件。

编辑:澄清一下,仅在使用内置渲染策略(g.render、hal.render、jsonapi.render 等)时不支持。你仍然可以以任何你想要的方式自己构建视图:

json 
    someLocalDate LocalDate.now.format(...)

Edit2:Json 视图 1.2 已与 grails-java8 插件(也是 1.2 版)一起发布。 Java 8 日期类型渲染现在与 2 个插件一起支持开箱即用。

【讨论】:

那么这是否意味着在那之前我们不能在域类中使用 loacalDateTime 来休息?我刚刚在 json 视图 1.1.5 中遇到了这个问题,如果我有没有 java8 插件也没关系 您仍然可以使用 json 视图,您只需要自己构建它们,而不是依赖默认渲染器 (g.render)。

以上是关于Grails 3.2 JSON 视图中的 Java 8 LocalDate的主要内容,如果未能解决你的问题,请参考以下文章

Grails 中视图的 JSON 输出

如何使用 Grails 4 JSON 视图呈现域对象的地图

Grails - 控制器和视图之间的通信

一旦AngularJs中的数据库发生变化,如何实现自动视图更新?

从 Grails 中的布局视图访问模型

Grails 中的 SQL/数据库视图