介绍

365bet地区365bet地区 Views项目为365bet地区框架提供了其他视图技术,包括JSON和标记视图。

JSON视图允许使用Groovy呈现JSON响应流JsonBuilder.

标记视图允许使用Groovy呈现XML响应标记模板引擎.

但是,该项目的核心可扩展到任何可能基于Groovy DSL的视图实现。以下各节介绍了Groovy JSON视图的用法

JSON视图

介绍

JSON视图以Groovy结尾,文件扩展名是格森并居住在grails应用程序视图目录它们提供用于以JSON格式生成输出的DSL。

grails应用程序浏览量hello gson
json消息你好"世界"
}

上面的JSON视图输出结果

{"信息":{ "你好":"世界"}}

json变量是的实例流JsonBuilder看到文件资料在Groovy用户指南中以获取更多信息流JsonBuilder.

更多示例用法

json1,2,3) == "[1,2,3]"json名称"鲍勃" } == '名字鲍勃'json1,2,3ñ } == 'n n n'

您可以指定模型以两种方式之一查看模型

grails应用程序浏览量hello gson
模型消息json消息你好消息

或与领域Groovy提供的转换

grails应用程序浏览量hello gson
进口 常规转换场
领域 消息json消息你好消息

版本记录

当前版本为以下是版本历史记录

1.3.0

  • 包括支持的更改方式可能会破坏现有用例包括队长队长姓名以前排除了所有其他字段,除了队长姓名队长在列表中对于队长姓名发挥预期的作用队长输入将导致所有字段队长要恢复以前的行为,只需删除队长条目包括队长队长姓名包括队长姓名.

1.2.0

  • JSON API支持

  • 能够注册自定义转换器

  • 日期格式和Unicode转义的新配置选项

  • 与测试支持框架集成的新测试特性

1.1.0

  • 全局模板支持

  • 模板继承

  • 适用于MongoDB GeoJSON的GORM的全局模板

  • 支持轻松测试JSON视图JsonViewTest

  • HAL中的分页支持

  • HAL中更好的嵌入式支持

  • 能够访问HTTP参数和标头

  • 资源扩展扩大参数

  • 控制器名称空间支持

  • 支持默认对象对象gson模板

1.0.0

  • 初始GA发布

安装

要激活JSON视图,请将以下依赖项添加到依存关系你的块建立gradle:

编译org grails插件视图json

如果您还使用MongoDB,则可能需要添加查看json模板依赖也包括对GeoJSON的支持

编译org grails插件视图json模板

要为生产环境启用JSON视图的Gradle编译,请将以下内容添加到构建脚本 依存关系

buildscript依赖关系classpath org grails插件视图gradle

然后应用org grails插件视图json365bet地区365bet地区核心gradle插件之后的Gradle插件

应用插入: "组织grails grails网站"应用插入: "org grails插件视图json"

这将添加一个编译GsonViews生成JAR或WAR文件时执行的Gradle任务

范本

模板基础

您可以定义以下划线开头的模板_例如,给定以下模板,格森人:

365bet地区应用程序查看人人gson
型号人人json名称人名年龄人年龄

您可以使用g呈现方法

grails应用程序查看人数显示gson
模型人人json g渲染模板:"", 模型:[

上面的假设视图与模板位于同一目录中。如果不是这种情况,则可能需要使用相对于模板的URI。

grails应用程序浏览家庭展示gson
模型人人json g渲染模板:"", 模型:[

模板命名空间

可以使用模板名称空间简化前面的示例

grails应用程序查看人数显示gson
模型人人json tmpl人人

在此示例中,方法调用的名称在这种情况下,用于指示要渲染的模板

模板的参数成为模型。模型变量的名称与模板名称相同。如果您要更改此名称,可以改为传递地图

grails应用程序查看人数显示gson
模型人人json tmpl人个人

在上面的示例中,模型变量传递给了格森人模板称为个人.

当您要使用相对路径渲染模板时,也可以使用此技术

grails应用程序查看人数显示gson
模特人人json tmpl''(

模板名称空间甚至接受集合或任何可迭代的宾语

grails应用程序查看人数显示gson
模型清单[]json tmpl人人

在这种情况下,输出为JSON数组例如

    [{"那么":"弗雷德",年龄:10},{"那么":"鲍勃",年龄:12}]

当渲染一个可迭代的您还可以指定型号名称

grails应用程序查看人数显示gson
模型清单[]json tmpl人"所有者"

模板将定义一个字段人所有者

如果您需要在模板的每次迭代中都是静态的其他数据,则也可以传入模型

grails应用程序查看人数显示gson
模型清单[]json tmpl人人关系: "父亲"])

模板可以定义一个字段字符串关系

通过传入集合,插件将迭代集合上的每个元素,并将模板呈现为JSON数组。如果您不希望发生这种情况,请改用采用map方法的变体

grails应用程序查看人数显示gson
模型清单[]json tmpl人

渲染模板的更多方法

g呈现方法很灵活,可以以多种形式呈现模板

模型家庭家庭json名称家庭父亲姓名年龄家庭父亲最大年龄儿童g渲染模板:"", 模型:[家庭儿童最大人数p p年龄儿童g渲染模板:"", 采集家庭孩子:'')
}

但是,这些用例中的大多数都与模板名称空间更为简洁

模型家庭家庭json名称家庭父亲姓名年龄家庭父亲年龄最大

模板继承

JSON模板可以从父模板继承。例如,考虑以下父模板

grails应用程式浏览父gson
模型宾语对象json hal链接对象版本"1.0"
}

子模板可以使用以下命令从上述模板继承继承方法

grails应用程序查看人gson
继承模板:"父母"型号人人json名称人名

来自父模板和子模板的JSON将被组合,以便输出为

 {
   "链接": {
     "": {
       "href": "http本地主机人",
       "反射性": "",
       "类型": "应用程序hal json"
     }
   },
   "": "1.0",
   "那么": "弗雷德"
 }

父模板的模型将由子模板模型和超类名称组成,例如,如果模型是人人哪里从...延伸宾语那么传递给父模板的最终模型将如下所示

[宾语

如果该类从称为哺乳动物那么传递给父级的模型将是

[哺乳动物

这使您可以围绕对象继承设计模板

您可以使用来定制传递给父模板的模型模型论点

继承模板:"父母", 模型:[

渲染域类

领域类渲染的基础

通常,您的模型可能涉及一个或多个域实例,JSON视图提供了一个渲染呈现这些的方法

例如,给出以下域类

  {
    标题

和以下模板

模型书json g渲染书

结果输出是

{"ID":1,"标题":"展台"}

您可以通过包含或排除属性来自定义渲染

json g渲染书包括:['标题']])

或通过提供闭包来提供其他JSON输出

json g呈现书页1000
}

或结合两种方法

json g渲染书包括:['标题'页数1000
}

域类的深层渲染

通常情况下g呈现方法只会将对象呈现一层深度。换句话说,如果您有一个域类,例如

  {
    标题作者作者

结果输出将类似于

{"ID":1,"标题":"展台","作者":{ID:1}}

如果您希望作者要包含在渲染中,首先有两个要求,您必须确保已初始化关联

如果渲染方法遇到一个代理,它将不会遍历该关系以避免N个查询性能问题

一对多集合关联也是如此。如果关联尚未初始化,渲染方法不会遍历集合

因此,您必须确保查询使用联接

findByTitle"展台", [:[作者:"加入"]])

其次,当致电渲染你应该通过的方法论点

json g渲染书:真正])

或者,仅扩展单个关联,您可以使用扩大论点

json g渲染书扩大:['作者']])
请求参数也可以用于扩展关联,例如扩大作者如果您不想允许这样做,请使用包括要么排除只包含您想要的属性

最后,如果您希望自己处理渲染,则可以通过排除该属性来完成

json g渲染书排除:['作者'作者姓名书作者姓名

域类渲染和模板

替代默认行为的渲染方法是依靠模板

换句话说,如果您创建一个作者作者gson模板,然后使用g呈现实例的方法:

json g渲染书

每当作者遇到关联g呈现方法将自动呈现作者作者gson而是模板

JSON View API

所有JSON视图子类JsonViewTemplate默认情况下

JsonViewTemplate超类实现JsonView特质又扩展了365bet地区365bet地区View特征

由于这些特性,JSON视图可以使用几种方法和属性来完成不同的任务

链接可以使用g连结方法

json人名"鲍勃"主页g链接控制者:"", ID:"鲍勃")
}

g连结方法类似于GSP中的等效标记,并允许您轻松创建到其他控制器的链接

更改响应标题

要自定义内容类型和标题,请使用响应由定义的对象HttpView特征

响应contentType"应用程序hal json"响应头"代币", ""json人名"鲍勃"
}

HttpView特征定义了多种检查请求和更改响应的方法

可用的方法只是通过HttpServletRequestHttpServletResponse对象,这是设计使然,因为应限制视图逻辑,并在控制器中执行逻辑

访问请求

可以访问请求的各个方面请求由定义的对象HttpView特征

json人名"鲍勃"userAgent请求getHeader'用户代理')
}

可以通过参数对象是参量:

json人名"鲍勃"第一参数int'抵销', 0排序参数获取'分类', '那么')
}

默认静态导入

默认情况下,导入以下类的静态属性

  • org springframework http HttpStatus

  • org springframework http HttpMethod

  • grails网站http HttpHeaders

这意味着您可以使用响应对象使用这些常量而不是硬编码数字设置状态

未找到响应状态

或使用适当的HTTP方法生成链接

g连结资源:"图书", 方法开机自检

语言环境集成

您可以使用g消息方法

json错误描述g消息:'默认错误信息')
}

您还可以通过将语言环境附加到视图名称来创建特定于语言环境的视图,例如格森人对于德语或格森人为默认

对于更复杂的消息查找,messageSource属性是Spring的一个实例讯息来源

访问配置

应用程序配置会自动注入到您的json视图中,只需参考即可访问它配置.

json foo config getProperty"酒吧", , 空值)
}

杂项属性

其他属性也可用

controllerName

当前控制器的名称

actionName

当前控制器动作的名称

controllerNamespace

当前控制器的名称空间

模型命名

365bet地区365bet地区在JSON视图中支持模型名称的约定如果约定不符合您的需求,则可以显式定义模型变量

一些型号名称是保留的因为视图中注入了相同名称的属性当地, 响应, 请求, , controllerNamespace, controllerName, actionName, 配置, 发电机

显式模型命名

给予意见

grails应用程序视图您好索引gson
模型消息json消息你好消息

然后,控制器必须指定要在视图中使用的名称

grails应用程序控制器HelloController groovy
定义 指数响应信息: "你好,世界")
    或留言Hello World
}

使用模板时

grails应用程序视图你好msg gson
模型消息json消息你好消息

在视图中,您可以使用汤普命名空间

JSON消息tmpl味精信息信息或g渲染模板味精模型消息消息
    或g渲染模板味精模型消息var消息
}

使用收藏

模型清单<消息json消息tmpl消息'信息'讯息或g渲染模板味精收集消息var message
}

按惯例建模

财产种类

呈现不可迭代的对象时,如果未指定名称,则使用类型的属性名称

grails应用程序视图您好索引gson
模型字符串json消息你好字符串

该变量可以直接传递给响应.

grails应用程序控制器HelloController groovy
定义 指数响应"你好,世界")
}

当使用汤普.

grails应用程序视图你好msg gson
模型字符串json消息你好字符串
grails应用程序视图您好索引gson
模型someString json tmpl msg someString

如果呈现了集合,则组件类型的属性名称将附加在集合类型的属性名称之后。组件类型基于列表中的第一项

清单stringList

stringSet

stringCollection

如果集合为空emptyCollection将用作默认模型名称。这是由于无法检查第一个对象的类型

grails应用程序视图您好索引gson
模型stringList json字符串stringList

该变量可以直接传递给响应.

grails应用程序控制器HelloController groovy
定义 指数响应"你好", "世界"])
}
当使用以下方式呈现集合时,组件集合约定不适用汤普在视图内
模板名称

使用模板时,除非指定,否则模型名称基于模板名称

给定以下模板

grails应用程序视图你好msg gson
模型味精或字符串JSON消息你好味精

使用模板从另一视图呈现单个消息

grails应用程序视图您好索引gson
json消息tmpl msg消息

使用模板从另一个视图呈现消息集合

grails应用程序视图您好索引gson
模型清单<stringList json消息tmpl msg stringList

在这两种情况下,均使用与模板名称匹配的变量名称约定

内容协商

365bet地区GSON视图与365bet地区内容协商基础结构集成在一起例如,如果您创建两个名为grails应用程式观看次数显示节目gsp用于HTML和grails应用程式观看次数显示节目gson对于JSON,您可以定义以下操作

grails应用程序控制器myapp BookController groovy
定义 节目响应获取参数ID

结果是,如果您发送请求到书展它将呈现显示gsp但是如果您向发送请求书展json它将呈现显示gson.

另外,如果客户发送带有接受标头包含应用程序json显示gson视图将被渲染

内容协商和域类

内容协商也可以很好地与域类配合使用,例如,如果您想定义一个模板来呈现任何实例,您可以创建一个域类格森与类名匹配的文件

例如给定一个类示范书你可以创建grails应用程序意见书book gson每当响应用的实例调用365bet地区365bet地区将渲染书格森.

定义 节目响应获取参数ID

如果您定义指数带有书单的动作

定义 指数响应清单

然后您可以创建一个对应的365bet地区应用程式浏览量书籍索引gson呈现每本书的文件

365bet地区应用程式浏览量书籍索引gson
领域 清单<bookList json tmpl图书bookList
365bet地区当使用对象列表进行响应时,365bet地区会自动将后缀List附加到模型名称中,因此在这种情况下,模型名称为bookList

通过调用Tmpl书方法与书籍清单有关grails应用程序意见书book gson将为每个模板呈现一个模板,并返回一个JSON数组

全局默认模板

您还可以定义一个对象对象如果在内容协商期间未找到其他模板,则默认情况下呈现的模板为此,请创建一个名为365bet地区应用程序视图对象对象gson模型的名称在哪里宾语例如

模型宾语对象json g渲染对象

内容协商和版本化API

构建REST API时的典型用例是要求支持API GSON视图的不同版本,可以通过在视图名称中包含该版本来对版本进行版本化

365bet地区然后,365bet地区将使用接受版本解析视图时的标题

例如给定一个名为书展gson如果您希望弃用以前的API并创建版本API,则可以重命名以前的视图书展v gson并创建一个新的书展gson代表API的新版本

然后,当客户端发送带有接受版本标头包含书展v gson视图将被呈现,而不是书展gson.

内容协商和视图解析策略

365bet地区在尝试解析视图时,365bet地区考虑了许多因素,包括内容类型版本和语言环境

搜索以下路径

  • 视图名称LOCALE接受内容类型接受版本gson示例显示de hal v gson

  • 视图名称LOCALE ACCEPT CONTENT TYPE gson示例显示de hal gson

  • 视图名称LOCALE ACCEPT VERSION gson示例显示de v gson

  • 视图名称LOCALE gson示例show de gson

  • 视图名称接受内容类型接受版本gson示例显示hal v gson

  • 视图名称接受版本接受内容类型gson示例show v hal gson

  • 视图名称ACCEPT CONTENT TYPE gson示例显示hal gson

  • 视图名称ACCEPT VERSION gson示例show v gson

  • 视图名称gson示例show gson

内容类型由接受考虑到URI中的标头或文件扩展名,以允许同一视图使用不同的格式

内容协商和自定义Mime类型

365bet地区某些REST API使用自定义mime类型的概念来表示资源。在365bet地区中,您可以例如在以下位置定义自定义mime类型:grails应用配置会议应用yml:

:
    哑剧:
        类型:
            所有:      "*/*"
            :     "应用程序vnd图书org图书json"
            bookList: "应用程序vnd图书组织图书清单json"

一旦定义了这些自定义mime类型,您就可以定义一个视图,例如显示书gson对于该特定的mime类型

HAL支持

东西是表示JSON的标准格式,由于其表示资源之间的链接并提供可导航的API的能力而受到关注

365bet地区365bet地区的JSON视图插件提供了开箱即用的HAL支持。所有JSON视图都可以访问案件实现的实例HalViewHelper.

例如

模型本书json hal链接本书hal嵌入式作者本书作者第一作者作者姓名作者姓名标题书名
致电是Linux吗必须是json关闭

产生HAL输出

{
    "链接": {
        "": {
            "href": "http localhost书展",
            "反射性": "",
            "类型": "应用程序hal json"
        }
    },
    "嵌入式的": {
        "作者": {
            "链接": {
                "": {
                    "href": "http localhost作者显示",
                    "反射性": "",
                    "类型": "应用程序hal json"
                }
            },
            "那么": "斯蒂芬·金"
        }
    },
    "标题": "展台"
}

上面的示例使用是Linux吗呈现域资源链接的方法,以及半嵌入式定义构成HAL响应一部分的任何嵌入式对象的方法

是Linux吗该方法默认情况下会创建到资源的链接,但是您可以通过使用以下任一方法对域类进行注释来定义其他链接grails rest可链接要么grails rest资源并使用链接对象的方法

书籍连结rel:"发布者", href:"http foo com书籍")

该链接将包含在HAL输出中

如果您想具体说明要包含的链接,可以通过传递要链接的对象图来实现。

模型预订json hal链接作者书作者

另外,如果您希望自己定义HAL链接,则可以通过将闭包传递给是Linux吗方法

模型预订json hal链接self href'...'反射性''类型"应用程序hal json"
        }
    }
    ...
}

将域类呈现为HAL

如果您希望让插件处理对象的呈现,则可以使用渲染事物方法

模型书json hal渲染书

渲染事物方法的工作原理与g呈现接受相同参数的方法,不同之处在于它会通过输出对象的HAL链接是Linux吗并输出通过联接查询获取的关联半嵌入式.

例如,您还可以使用闭包自定义生成的HAL的内容

模型书json hal渲染书页1000
}

嵌入式协会和HAL

通常在使用渲染事物方法嵌入式的仅针对已初始化并热切获取的关联呈现关联。这意味着以下查询将不会呈现书作者协会

获取参数ID

但是,此查询将呈现书作者协会

获取参数ID:[作家:'急于']])

这是设计使然,目的是防止由于N个查询加载而导致性能意外下降。渲染渲染方法嵌入式的HAL的关联,您可以使用论点

json hal渲染书:真正])

您可以预防HAL嵌入式的使用嵌入假参数

模型书json hal渲染书嵌入式的:])

您也可以不使用渲染事物通过使用半嵌入式方法

模型图书json hal嵌入式图书标题图书标题
是Linux吗方法半嵌入式方法应排在JSON输出中的任何其他属性之前

您还可以通过使用map参数来控制应嵌入哪些关联

模型书json hal嵌入式作家书作者书名书名

而且,您可以使用我们诅咒吗方法

模型书json hal嵌入式作家图书作者大厅在线图书

要自定义内联JSON输出的内容,请使用闭包

模型书json hal嵌入式作家图书作者不得在线内书页300
    }
}
致电后,您将无法添加其他内容我们诅咒吗因为这将产生无效的JSON

你可以结合半嵌入式是Linux吗准确获取所需的链接和嵌入内容

模型预订json hal链接半嵌入式书作家图书作者不得在线内书页300
    }
}

指定HAL内容类型

默认的HAL响应内容类型是应用程序hal json但是,如自定义Mime类型您可以定义自己的响应内容类型来表示您的资源

例如,给定以下配置grails应用配置会议应用yml:

:
    哑剧:
        类型:
            所有:      "*/*"
            :     "应用程序vnd图书org图书json"

您可以将HAL内容类型设置为显式内容类型,或者将HAL内容类型设置为grails mime类型yml应用程序:

模型hal类型""json

HAL分页

365bet地区365bet地区的JSON视图插件提供了可导航的分页支持,例如GSP标记参数包括, 最大值, 抵销, 分类订购.

例如

模型可迭代的<bookList整数bookCount整数最大值可选默认为
    整数抵销可选默认为
    分类可选的
    订购可选的json hal分页bookCount最大偏移量排序顺序
相似是Linux吗分页的东西必须是json关闭

访问时http本地主机偏移量这将产生可导航的输出,例如

{
  "链接": {
    "": {
      "href": "http本地主机书索引偏移量最大值",
      "反射性": "在美国",
      "类型": "应用程序hal json"
    },
    "第一": {
      "href": "http本地主机书索引偏移量最大值",
      "反射性": "在美国"
    },
    "上一个": {
      "href": "http本地主机书索引偏移量最大值",
      "反射性": "在美国"
    },
    "下一个": {
      "href": "http本地主机书索引偏移量最大值",
      "反射性": "在美国"
    },
    "持续": {
      "href": "http本地主机书索引偏移量最大值",
      "反射性": "在美国"
    }
  },
  ...
}
如果没有足够的结果进行分页,则导航链接将不会显示上一个下一个链接仅在有上一页或下一页时显示

如果您要与分页链接一起包含其他链接,则可以使用是Linux吗分页参数的方法

模特作者作者可迭代的<bookList整数bookCount json要分页的模型类型和总数是Linux吗作者作者bookCount

JSON API支持

JSON API是表示JSON的标准格式

365bet地区365bet地区的JSON视图插件提供了开箱即用的JSON API支持。所有JSON视图都可以访问jsonapi实现的实例JsonApiViewHelper.

365bet地区365bet地区视图尽最大努力遵守JSON API标准,但是仅适用于数据格式。规范对响应代码,URL约定和其他与服务器相关的概念提出了许多断言

365bet地区365bet地区中的JSON API支持也仅适用于域类,因为该规范依赖于关系和标识符的概念,因此没有明确的方法来确定这些概念将如何应用于常规Groovy类。结果,不支持常规Groovy类

使用JSON API的最简单示例只是将域类传递给渲染的方法jsonapi宾语

例如

模型书json jsonapi渲染书

在示例中看起来像下面

  {
    标题作者作者

这是一个例子JSON API呈现的实例可能看起来像

{
  "数据": {
    "类型": "",
    "ID": "3",
    "属性": {
      "标题": "王者回归"
    },
    "关系": {
      "作者": {
        "链接": {
          "": "作者"
        },
        "数据": {
          "类型": "作者",
          "ID": "9"
        }
      }
    }
  },
  "链接": {
    "": "http本地主机书"
  }
}

JSON API对象

包括JSON API对象在响应中包括一个jsonApiObject争论渲染方法

模型书json jsonapi渲染书jsonApiObject: 真正])

响应将包含jsonapi版本作为结果对象中的第一个键

元对象

加上元数据对你的回应如果还使用了此功能,则可以传递参数进行渲染,其值是应渲染的对象jsonApiObject是元数据将被呈现为jsonapi对象的meta属性

模型书json jsonapi渲染书: [那么: "元数据信息"]])

响应将包含元名称元数据信息作为结果对象中的第一个键

渲染错误

JSON API规范具有有关如何呈现错误的说明365bet地区对于365bet地区实施,这适用于异常和验证错误

例外情况

如果将异常传递给渲染方法,它将在规范内呈现

在例外的例子中新的RuntimeException oops以下将呈现

{
  "错误": [
    {
      "状态": 500,
      "标题": "java lang RuntimeException",
      "详情": "哎呀",
      "资源": {
        "堆栈跟踪": [
          //一种ñ 一种[R[R一种 F 一世ñF[R一种Ť一世ñ [R一种Ť一世ñG Ť ŤH sŤ一种CŤ[R一种C
        ]
      }
    }
  ]
}
验证错误

在验证错误的情况下,当那么属性失败空白约束

{
  "错误": [
    {
      "": "空白",
      "详情": "类class com foo Bar的属性名称不能为空",
      "资源": {
        "宾语": "与foo Bar",
        "领域": "那么",
        "被拒绝的值": "",
        "bindingError": 
      }
    }
  ]
}

通常,当关系具有值时,将提供关系链接

a的示例输出具有一个关系,其中值是null

"队长": {
  "数据": 空值
}

当值不为null时

"作者": {
  "链接": {
    "": "作者"
  },
  "数据": {
    "类型": "作者",
    "ID": "9"
  }
}

对于许多关系,当前不支持链接

分页

JSON API规范的一部分说明了分页365bet地区365bet地区实现遵循编写的规范

要在输出中启用分页链接,您必须正在渲染一个集合,并且除了要渲染的集合外还必须包含一些自变量。total和resource这两个必需的自变量默认偏移量为max,max为

模型清单<图书整数bookTotal json jsonapi渲染书籍分页: [bookTotal资源: ]])

示例链接输出,如果bookTotal:

"链接": {
  "": "图书",
  "第一": "http本地主机书籍最大偏移量",
  "下一个": "http本地主机书籍最大偏移量",
  "持续": "http本地主机书籍最大偏移量"
}

默认情况下,抵销, 分类, 最大值订购将来自具有相同名称的参数。您可以通过在分页映射中传递相应的参数来覆盖它们的值

模型清单<图书整数bookTotal json jsonapi渲染书籍分页: [bookTotal资源: , 最大值: 20, 分类参数myCustomSortArgument

社团协会

JSON API规范详细介绍了关系的呈现方式第一种方法是通过描述的关系对象这里默认情况下,现在关系将在json视图中呈现

如果您根本不希望呈现关系,协会参数可以传递给渲染值为false

模型书json jsonapi渲染书协会: ])

规范中还有一节描述复合文件如果您希望以这种方式呈现一个或多个关系,则可以包括扩大论点

模型书json jsonapi渲染书扩大: "作者"]) 也可以是字符串列表

包括排除项

365bet地区365bet地区中的JSON API实现支持与常规JSON视图相同的包含和排除支持,请参见渲染详情

标识符呈现

365bet地区365bet地区提供了一种自定义域类标识符的呈现的方法。要覆盖默认行为,请注册一个实现JsonApiIdRenderStrategy.

grails app conf春季资源groovy
bean jsonApiIdRenderStrategy MyCustomImplementation

JsonTemplateEngine

JSON Views插件注册了一个名为jsonTemplateEngine类型JsonViewTemplateEngine.

此类是常规的Groovy模板引擎并且您可以使用引擎在HTTP请求范围之外呈现JSON视图

例如

自动接线JsonViewTemplateEngine templateEngine虚空myMethod模板t templateEngine resolveTemplate'书展')
        定义可写的:  (标题:"展台"))
        定义SW StringWriter可写writeTo sw

静态编译

JSON视图是静态编译的如果愿意,可以通过设置禁用静态编译365bet地区视图json compileStatic:

:
    意见:
        json:
            静态编译: 
如果禁用静态编译,渲染性能将受到影响

对于模型变量,您需要声明类型,否则会出现编译错误

型号人人json名称人名年龄人年龄

测试中

尽管通常可以通过HTTP客户端使用功能测试来完成测试,但JSON视图插件还提供了一个特性,可以帮助编写单元测试或集成测试

要使用特征导入grails插件json视图测试JsonViewTest类并将其应用于任何Spock或JUnit测试

进口 grails插件json视图测试
进口 spock lang规格
 我的规格 延伸规格实施JsonViewTest

特质提供了许多不同的渲染可以呈现JSON视图的方法实现grails应用程序视图或渲染内联字符串,例如渲染内联模板

虚空 "测试呈现原始GSON视图"() {
    什么时候:"渲染了gson视图"JsonRenderResult结果呈现'''型号字符串人json人名人''', [:"鲍勃"] (1)

    然后:"json是正确的"结果json人名'鲍勃' (2)
}
1 使用渲染返回一个方法JsonRenderResult传入作为内联模板的String和作为模型的地图
2 声明由表示的已解析的JSONjson属性正确

要渲染现有视图或模板,请使用命名参数指定模板或视图的绝对路径

什么时候:"渲染了gson视图"
定义结果渲染模板: "模板的路径", 模型:[年龄:10])

然后:"json是正确的"结果json名称'弗雷德'结果json年龄10

如果您正在编写单元测试,并且模型涉及领域类,则可能需要将领域类添加到mappingContext对象以使其正确呈现

什么时候:"为域类呈现gson视图"mappingContext addPersistentEntity MyDomain定义结果渲染模板: "模板的路径", 模型:[myDomain我的域名然后:"json是正确的"结果json名称'弗雷德'结果json年龄10
在单元测试中json视图生成的链接可能与标准环境中通常生成的链接不匹配。要完全测试链接,请使用功能测试

新的测试框架

365bet地区自从发布json视图以来,为365bet地区发布了一个新的测试框架。已经开发了一个与新测试框架一起使用的新特性,该新测试框架旨在替换现有特性。为了向后兼容,将保留现有特性

新特性与旧特性的工作方式完全相同,但是由于新特性是为与新框架一起使用而设计的,因此您可以利用以下几个好处:第一个是配置在旧特性中,应用程序配置未包含在配置中。可能产生错误结果的模板引擎其他好处包括可扩展性和功能,例如之前.

要开始,请添加org grails视图json测试支持版本依赖于您的项目并实施JsonViewUnitTest测试中的特征而不是JsonViewTest.

像测试框架这样的新测试特性需要Spock

插件支持

365bet地区365bet地区插件以及标准的Gradle Java Groovy项目都可以为您的应用程序提供json视图

365bet地区365bet地区插件

由于JSON视图已编译,因此所有插件的视图和模板都可在您的应用程序中使用

视图分辨率将在应用程序的所有已配置插件中查找与特定名称匹配的视图。默认情况下,插件提供的视图应存储在其中grails应用程序视图就像应用程序一样

基础图书馆

在标准库中提供视图的最常见用例是提供全局模板全局模板是旨在将给定类呈现为JSON的模板。为了在标准Gradle项目中提供视图,您应该配置自己的视图编译任务

以下是示例Gradle构建,它添加了一个编译视图模板任务位于src main gson:

buildscript存储库maven url https repo grails org grails核心依赖项classpath org grails插件视图gradle导入grails视图gradle json Apply插件Java存储库maven url https repo grails org grails核心依赖项compile org grails插件视图json compileOnly org grails grails插件rest compileOnly javax servlet javax servlet api任务compileViews类型JsonViewCompilerTask源项目文件src主要gson destinationDir项目文件构建类主要packageName类路径配置编译配置compileOnly类dependsOnCompileViews

一旦安装到位,包含此库的所有应用程序都可以访问提供的模板

例如,如果要渲染所有类型的实例foo bar生日创建一个名为src main gson foo bar Birthday gson然后编译模板并将JAR放在应用程序的类路径中

看到GeoJSON模板以MongoDB为例,说明如何为Mongo特定类提供全局模板

自定义编译任务

除非另外配置插件的项目名称项目名用作包裹名字编译JSON视图时

在摇篮中项目名通常是从当前目录计算得出的,这意味着如果当前目录与您的插件名称之间不匹配,则插件的视图解析可能会失败

例如考虑一个名为FooBar365bet地区插件365bet地区在这种情况下,365bet地区将搜索与插件名称匹配的视图富吧但是,如果调用了插件所在的目录fooBar代替富吧然后将插件安装到应用程序中时,视图解析将失败并且将找不到该视图

要解决此问题,您可以自定义编译GsonViews插件中的任务建立gradle

compileGsonViews packageName"富吧"
}

通过设置包裹名字属性以正确匹配名为的插件的约定365bet地区FooBar365bet地区插件画它富吧查看分辨率将成功

组态

JSON视图配置可以在以下范围内更改grails应用配置会议应用yml内的任何属性JsonViewConfiguration可以设置接口json视图配置扩展GenericViewConfiguration因此也可以设置该界面中的任何属性

例如
:
    意见:
        json:
            静态编译: 真正
            : 真正
            ...

或者,您可以注册一个新的JsonViewConfiguration使用bean名称的beanjsonViewConfigurationgrails应用conf资源groovy.

中的相同设置grails应用配置会议应用ymlGradle插件也将使用它进行生产编译

Gradle插件使用派生的编译器编译视图您可以在Gradle中配置派生的编译任务,如下所示

compileGsonViews compileOptions forkOptions memoryMaximumSize'兆字节'
}

请参阅APIGroovyForkOptions了解更多信息

更改视图基类

所有JSON视图子类JsonViewTemplate默认情况下

但是,您可以更改子类,该子类应该是JsonViewTemplate使用配置

:
    意见:
        json:
            静态编译: 真正
            baseTemplateClass: 带有示例MyCustomJsonViewTemplate

通过特征添加新的辅助方法

另外,除了修改基类,您还可以通过特征添加新方法

例如HttpView使用增强注释以添加反对所有观点

进口 伪像增强
进口 查看视图

增强查看TYPE特质HttpView返回响应对象回应回应

结果是所有JSON视图都有一个响应可用于控制HTTP响应的对象

响应头"代币", ""
365bet地区特质不能在您正在编译的同一项目中定义,因为它必须在要编译的项目的类路径中,所以您需要在此方案中创建365bet地区插件并使用多项目构建

默认Mime类型

默认情况下,JSON视图呈现将接受的mime类型是可配置的

:
    意见:
        json:
            mimeTypes:
              - 应用程序json
              - 应用程序hal json

Unicode转义

默认情况下,将不转义unicode字符如果您希望在输出中转义unicode字符,请设置以下配置

:
    意见:
        json:
            发电机:
                escapeUnicode: 真正

默认日期格式

的默认格式java有用的日期可以配置

:
    意见:
        json:
            发电机:
                日期格式: "yyyy MM dd T HH mm ss Z"

此外,还可以指定默认语言环境

:
    意见:
        json:
            发电机:
                当地: "在美国"

默认时区

可以配置默认时区。此处的值将传递到时区getTimeZone

:
    意见:
        json:
            发电机:
                时区: "格林威治标准时间"

定制转换器

可以注册自定义转换器来更改使用json视图呈现给定类的方式,为此可以创建一个实现转换器然后,您必须在src主要资源META INF服务grails插件json生成器JsonGenerator Converter.

 我的转换器 实施JsonGenerator转换器覆写
    布尔值处理类型CustomClass isAssignableFrom类型覆写
    宾语兑换宾语键CustomClass值名称 自定义类 {
    那么

由于插件可能会提供转换器,因此您还可以通过实施已订购转换器中的界面

src主要资源META INF服务grails插件json生成器JsonGenerator Converter
foo MyCustomConverter
如果您要注册多个类,请将每个类放在自己的行中

IntelliJ支持

打开时格森Intellij中的文件应该使用常规的Groovy编辑器打开

该插件包括一个IntelliJ GDSL文件使用IntelliJ IDEA时提供代码完成的功能

Intellij GDSL是一种描述可用方法和属性的方法,以便开发人员在打开时即可完成代码格森档案

GDSL文件通常与代码库保持最新,但是如果发现任何变化,请提出问题.

调试视图

通常,视图应该保持简单,如果到达需要调试视图的位置,则视图中可能包含太多逻辑,在提供模型之前,最好由控制器进行处理

不过,这里有一些视图调试提示,可帮助您确定视图中的问题

内省模型

每个JSON视图都是Groovy脚本,和其他Groovy脚本一样,模型是在捆绑变量因此,您可以随时通过记录或打印绑定变量轻松地找到模型

模型使用log变量日志调试"模型是$捆绑变数"
用掉系统
系统打印输出"模型是$捆绑变数"json g渲染书
如果您使用日志变量,那么您将需要启用日志记录看风景包装在365bet地区应用程序配置会议日志回切

连接调试器

像Intellij IDE这样的一些IDE允许您在视图本身内设置断点和逐步调试如前所述,您不应该到达这一点,如果您这样做的话,视图中的逻辑就太多了,但是如果确实需要它,功能就可以了

标记视图

介绍

标记视图以Groovy结尾,文件扩展名是GML并居住在grails应用程序视图目录

标记视图插件使用Groovy标记模板引擎而且您通常可以使用Groovy用户指南作为语法参考

标记视图示例

模型可迭代的<地图汽车xmlDeclaration汽车汽车每辆汽车使: 使模型: 模型

给定模型,这将产生以下输出,例如汽车使奥迪A型:


<> 使='奥迪' 模型='一种'/>

有关更多示例,请参见Groovy。标记模板引擎文件资料

所有标记视图子类标记视图模板默认情况下

标记视图模板超类实现标记视图特质又扩展了365bet地区View特征

安装

要激活标记视图,请将以下依赖项添加到依存关系你的块建立gradle:

编译org grails插件视图标记

要启用用于生产环境的标记视图的Gradle编译,请将以下内容添加到构建脚本 依存关系

buildscript依赖关系classpath org grails插件视图gradle

然后应用org grails插件视图标记365bet地区核心gradle插件之后的Gradle插件

应用插入: "组织grails grails网站"应用插入: "org grails插件视图标记"

这将添加一个compileMarkupViews生成JAR或WAR文件时执行的Gradle任务

查看API标记

所有标记视图子类标记视图模板默认情况下

标记视图模板超类实现标记视图特质又扩展了365bet地区View特征

JSON和标记视图之间共享许多API。但是,与JSON视图相比,有一个区别是必须使用这个引用父类的属性时作为前缀,例如,生成链接将产生编译错误

汽车每辆车使: 使hrefg连结控制者:'汽车'))
   }
}

但是以下工作正常

汽车每辆车使: 使href: 这个g连结控制者:'汽车'))
   }
}

注意这个提及时的前缀这个g链接.

组态

标记视图配置可以通过以下方式更改grails应用配置会议应用yml内的任何属性MarkupViewConfiguration类和Groovy模板配置可以设置课程

例如

:
    意见:
        标记:
            静态编译: 真正
            cacheTemplates: 真正
            自动缩进: 真正
            ...

或者,您可以注册一个新的MarkupViewConfiguration使用bean名称的beanmarkupViewConfigurationgrails app conf春季资源groovy.