在编写转换代码时,有哪些替代方法可以替代 asType() ?

2024-06-26

Groovy 中转换对象的约定似乎是使用as运算符和覆盖asType()。例如:

class Id {
    def value

    @Override
    public Object asType(Class type) {
        if (type == FormattedId) {
            return new FormattedId(value: value.toUpperCase())
        }
    }
}

def formattedId = new Id(value: "test") as FormattedId

然而,Grails 重写了实现asType()对于运行时的所有对象,以便它可以支持像render as JSON.

另一种方法是重写asType()在 Grails Bootstrap 类中如下:

def init = { servletContext ->
    Id.metaClass.asType = { Class type ->
        if (type == FormattedId) {
                return new FormattedId(value: value.toUpperCase())
        }
    }
}

但是,这会导致代码重复(DRY),因为您现在需要在 Bootstrap 和 Bootstrap 中重复上述操作andId 类,否则as FormattedId在 Grails 容器之外无法工作。

除了在 Groovy/Grails 中编写转换代码之外,还有哪些替代方案不会破坏良好的代码/OO 设计原则(例如单一职责原则或 DRY)? Mixin 在这里有用吗?


您可以使用 Grails 支持Codecs http://grails.org/doc/latest/guide/security.html#codecs自动添加encodeAs*您的 Grails 原型的函数:

class FormattedIdCodec {

    static encode = { target ->
        new FormattedId((target as String).toUpperCase()
    }

}

然后您可以在代码中使用以下内容:

def formattedId = new Id(value: "test").encodeAsFormattedId
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编写转换代码时,有哪些替代方法可以替代 asType() ? 的相关文章

  • Grails:在域类中动态注入服务

    我需要注入基于域属性的服务 到目前为止我想出了以下内容 ApplicationHolder application getServiceClass package property Service clazz 但以这种方式加载它不会注入它的
  • Grails 测试中的模拟配置

    在 Grails 2 0 X 之前 可以使用mockConfig测试扩展的基类提供的方法 然而 在 Grails 2 0 X 中 建议测试类使用 TestFormixin 而不是扩展基类 这个 mixin 似乎没有提供任何与mockConf
  • 在 Groovy 中将两个映射合并为结果映射

    我有两张地图 firstMap totalProjectCount 53 activeProjectCount 29 completedProjectCount 1 userCount 85 secondMap totalProjectCo
  • 在 mule 中使用 groovy 表达式来限制 IP

    我在 mule 中使用 cxf 创建了一个代理服务 我的 mule 版本是 3 3 0 CE 现在 我想在使用代理服务创建的 wsdl 中添加限制 我的限制不应允许他们看到我的 wsdl 的每个 IP 为此 我找到了 Groovy 表达式和
  • 带有第 3 方库的 Grails Asset-Pipeline 系统

    Grails2 4 现在使用的是资产管道用于管理和处理 Grails 应用程序 而不是资源系统 中的静态资产 这是相当新的 互联网上还没有太多关于它的文档 我的问题是 如何正确处理第三方库 例如 select2 http ivaynberg
  • Grails 在 gsp 中迭代与访问 Map 元素

    完整上下文 我正在尝试使用 grails 应用程序处理多个文件 我将显示的代码来自后处理页面 其中提供了有关已处理文件的信息 我最初的感觉是使用这样的代码 table tr th Parsed from Excel th th Upload
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 调试 Bootstrap.groovy 的最佳方法是什么?

    我正在将一些数据插入数据库 但即使我看不到任何验证错误 某些对象也没有插入 使用 stacktrace 或 sql 出错的最佳方法是什么 以便我可以找出问题所在 例如我这样做 new XXXXX property blah save flu
  • 如何在 gsp grails 文件上显示字符串新行?

    我已经在数据库中存储了一个字符串 当我保存并检索字符串时 我得到的结果如下 这是我的新对象 测试多条线路 测试 1 测试2 测试 3 这就是当我调用 save 和 index 方法时从 println 命令得到的结果 但是当我在屏幕上显示它
  • 访问静态范围内的全局变量

    有没有办法从同一脚本中声明的类的静态方法访问脚本中声明的全局变量 例如 def s 12345 class MyClass static def method println s 因为这样它会因错误而失败 You attempted to
  • 与字符串比较在 Jenkins 管道中不起作用

    知道为什么IF ELSE下面的作品 def checkPrValidity wordCountStr sh returnStdout true script git diff ignore space at eol target branc
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • 我可以在 Groovy 中编写注释吗?

    我知道我可以在 Groovy 中使用注释来注释我的类 但是我可以在 Groovy 中编写注释本身吗 而不是仅使用用 Java 编写的注释 如果有 从哪个版本开始 您可以在 Groovy 中定义注释 查看更多 http docs groovy
  • 将域类从 GORM 独立模块导入到 Grails 中

    我有两块拼图 1 一个名为的无 Grails 项目core module使用独立的 GORM dependencies compile org grails grails datastore gorm mongodb 6 0 4 RELEA
  • Python 中的安全解除引用

    Groovy 有一个很好的安全取消引用运算符 这有助于避免 NullPointerExceptions variable method The method仅当以下情况时才会被调用variable is not null 有没有办法在 Py
  • 加载部分模板 Ajax - 使用 Grails

    我正在创建一个 grails web 应用程序 并且有主索引 gsp 并且有几个通用组件 这些组件在我使用部分模板的网站上的大多数页面中都是通用的 每个部分模板都将是非常独立的 并且包含非常不同的信息 因此每个部分模板都应该从不同的控制器获
  • 访问settings.gradle中存储在gradle.properties中的点属性

    我有一个Gradle 6 0 1项目 这build gradle 摘录 看起来像 plugins id application id com github edeandrea xjc generation id eclipse id ide
  • 使用 Java bean 作为 Grails 域类

    有很多类似的问题 但我无法确切地找到如何在 grails 应用程序中使用 POJO 模型 考虑以下 Java Bean package com example java public class UserBean String name S
  • url 映射中的语言前缀不适用于所有情况

    我在语言映射方面遇到问题 我希望它的工作方式是在 URL 中编码语言 如 appname de mycontroller whatever 如果您转到 appname mycontroller action 它应该检查您的会话 如果没有会话
  • 如何在 Jenkinsfile 中增加 NPM package.json 的版本

    我正在尝试修改 Jenkinsfile 以在部署服务器之前更改 NPM 包的版本 我在部署方法上有这个 if env GIT COMMIT env GIT PREVIOUS COMMIT env GIT BRANCH origin deve

随机推荐