代码之家  ›  专栏  ›  技术社区  ›  Rafael

如何创建Grails HAL转换器

  •  0
  • Rafael  · 技术社区  · 10 年前

    我知道有一个HalJsonRenderer,但我想知道是否有一种方法可以使用JSON转换器,以便能够执行以下操作:

    render MyObject as HAL
    

    那个“as”操作符。。。它是如何工作的?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Burt Beckwith    10 年前

    更清楚的是发生了什么 render ... as JSON 如果在可选括号中添加:

    render(foo as JSON)
    

    render方法有几个重载,其中一个重载接受JSON,因此比较棘手的部分是 foo as JSON .

    Groovy通过将每个运算符与一个实际执行操作的方法配对,使重载运算符变得简单。这个 == 运算符是通过调用 equals 方法(或 compareTo 如果类实现 Comparable 这个 << 操作员呼叫 leftShift This archived page 有一个很好的运算符表及其相应的方法(Groovy站点最近进行了重大修改,这个页面似乎在混乱中丢失了)。

    as 从技术上讲,它不是一个运算符,但它的处理方式类似。如果您添加 asType 方法,它将被调用以使类有机会将自身转换为请求的类型:

    Object asType(Class c) { ... }
    

    Grails的接线方式 as JSON as XML 相当复杂,但重要的部分是添加 as类型 所有控制器的方法(除了 render , redirect , getParams (和相应的 params 属性)等)然后,该方法将转换为JSON或XML,或者如果目标类不是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 您需要添加 as类型 任何类的方法 foo 或者做一些类似Grails对JSON和XML所做的事情。添加 as类型 方法可能是不切实际的,尤其是当您希望支持多个类型时,如果这些类型是预先存在的类(如ArrayList),则更是如此。您可以实施 org.codehaus.groovy.grails.web.converters.Converter 与JSON和XML类类似的接口(查看支持代码,实际上需要扩展 org.codehaus.groovy.grails.web.converters.AbstractConverter ),并创建相关的支持类来进行转换(这都是为了可扩展而设计的,尽管我认为我没有见过有人这样做)。这会很有趣,可能是一个很好的学习体验,但正如我所说的,考虑到更直接的实现是多么简单,工作远远超出了它的价值。