我知道有一个HalJsonRenderer,但我想知道是否有办法像JSON转换器一样,以便能够做类似的事情:
render MyObject as HAL
那个“as”运算符......它是如何工作的?
答案 0 :(得分:2)
如果添加可选括号,render ... as JSON
会发生什么变得更清楚了:
render(foo as JSON)
render方法有一些重载,其中一个接受JSON,所以棘手的部分是foo as JSON
。
Groovy通过将每个操作符与实际完成工作的方法配对,可以直接使运算符重载。 ==
运算符是通过调用equals
方法实现的(如果类实现compareTo
,Comparable
运算符调用<<
等,则leftShift
。This archived page有一个很好的运算符及其相应的方法表(Groovy站点最近进行了彻底检查,这个页面似乎已经在shuffle中丢失了。)
as
在技术上不是运营商,但它的处理方式类似。如果添加asType
方法,将调用它以使类有机会将自身转换为请求的类型:
Object asType(Class c) { ... }
Grails连接as JSON
和as XML
的方式相当复杂,但重要的部分是向所有控制器添加asType
方法(除了render
之外, redirect
,getParams
(以及相应的params
属性)等。)此方法然后转换为JSON或XML,或者如果目标类不是传统的转换/转换t JSON或XML。
我认为直接支持这项工作会更有价值,所以如果是我,我会在服务中创建一个方法来完成将支持的类型转换为HAL并渲染它的工作,例如
class SomeService {
String asHal(foo) {
...
}
}
然后你可以从控制器中调用它:
class SomeController {
def someService
def anAction() {
...
def foo = ...
render someService.asHal(foo)
}
}
这不像render as HAL
那么方便,但它不是更多的工作,并且有不那么神奇的好处。
要支持render foo as HAL
,您需要将asType
方法添加到任何类foo
,或者执行类似于Grails对JSON和XML的操作。添加asType
方法可能不切实际,特别是如果要支持多种类型,如果这些类型是预先存在的类(如ArrayList),则更是如此。您可以像JSON和XML类那样实现org.codehaus.groovy.grails.web.converters.Converter
接口(查看支持代码,实际上需要扩展org.codehaus.groovy.grails.web.converters.AbstractConverter
),并创建将进行转换的关联支持类(这是所有设计都是可扩展的,虽然我不认为我见过有人这样做。这将是有趣的,可能是一个很好的学习经验,但正如我所说 - 更多的工作,而不是它的价值,因为更直接的实施是多么简单。