如何创建Grails HAL转换器

时间:2015-03-30 13:11:15

标签: grails converter hateoas

我知道有一个HalJsonRenderer,但我想知道是否有办法像JSON转换器一样,以便能够做类似的事情:

render MyObject as HAL

那个“as”运算符......它是如何工作的?

1 个答案:

答案 0 :(得分:2)

如果添加可选括号,render ... as JSON会发生什么变得更清楚了:

render(foo as JSON)

render方法有一些重载,其中一个接受JSON,所以棘手的部分是foo as JSON

Groovy通过将每个操作符与实际完成工作的方法配对,可以直接使运算符重载。 ==运算符是通过调用equals方法实现的(如果类实现compareToComparable运算符调用<<等,则leftShiftThis archived page有一个很好的运算符及其相应的方法表(Groovy站点最近进行了彻底检查,这个页面似乎已经在shuffle中丢失了。)

as在技术上不是运营商,但它的处理方式类似。如果添加asType方法,将调用它以使类有机会将自身转换为请求的类型:

Object asType(Class c) { ... }

Grails连接as JSONas XML的方式相当复杂,但重要的部分是向所有控制器添加asType方法(除了render之外, redirectgetParams(以及相应的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),并创建将进行转换的关联支持类(这是所有设计都是可扩展的,虽然我不认为我见过有人这样做。这将是有趣的,可能是一个很好的学习经验,但正如我所说 - 更多的工作,而不是它的价值,因为更直接的实施是多么简单。