Grails 将请求参数绑定到枚举

2023-12-22

我的 Grails 应用程序有大量的枚举,如下所示:

public enum Rating {
    BEST("be"), GOOD("go"), AVERAGE("av"), BAD("ba"), WORST("wo")
    final String id

    private RateType(String id) {
        this.id = id
    }

    static public RateType getEnumFromId(String value) {
        values().find {it.id == value }
    }   
}

如果我有一个像这样的命令对象:

class MyCommand {
    Rating rating
}

我想(例如)自动将值为“wo”的请求参数转换为Rating.WORST。

描述了定义自定义转换器的过程here https://stackoverflow.com/questions/963922/grails-date-unmarshalling(在将字符串转换为日期的上下文中)。尽管此过程运行良好,但我不想为每个枚举创建一个实现 PropertyEditorSupport 的类。有更好的选择吗?


我找到了一个令我非常满意的解决方案。

Step 1:创建 PropertyEditorSupport 的实现,以将文本转换为相关 Enum 或从相关 Enum 转换文本

public class EnumEditor extends PropertyEditorSupport {

    private Class<? extends Enum<?>> clazz

    public EnumEditor(Class<? extends Enum<?>> clazz) {
        this.clazz = clazz
    }

    public String getAsText() {
        return value?.id
    }

    public void setAsText(String text) {
        value = clazz.getEnumFromId(text)
    }
}

Step 2:定义一个类,将 EnumEditor 注册为各种枚举类的转换器。要更改可通过 id 绑定的枚举类列表,只需修改BINDABLE_ENUMS

public class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {

    private static final String REQUIRED_METHOD_NAME = 'getEnumFromId'

    // Add any enums that you want to bind to by ID into this list
    private static final BINDABLE_ENUMS = [Rating, SomeOtherEnum, SomeOtherEnum2]

    public void registerCustomEditors(PropertyEditorRegistry registry) {            

        BINDABLE_ENUMS.each {enumClass ->
            registerEnum(registry, enumClass)
        }
    }

    /**
     * Register an enum to be bound by ID from a request parameter
     * @param registry Registry of types eligible for data binding
     * @param enumClass Class of the enum
     */
    private registerEnum(PropertyEditorRegistry registry, Class<? extends Enum<?>> enumClass) {

        boolean hasRequiredMethod = enumClass.metaClass.methods.any {MetaMethod method ->
            method.isStatic() && method.name == REQUIRED_METHOD_NAME && method.parameterTypes.size() == 1
        }

        if (!hasRequiredMethod) {
            throw new MissingMethodException(REQUIRED_METHOD_NAME, enumClass, [String].toArray())
        }
        registry.registerCustomEditor(enumClass, new EnumEditor(enumClass))
    }
}

Step 3:通过在中定义以下 Spring bean,使 Spring 能够识别上面的注册表grails-app/conf/spring/resources.grooovy

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

Grails 将请求参数绑定到枚举 的相关文章

随机推荐

  • 使用 CloudFormation 添加对 AWS websocket API 的集成响应

    AWS recently released Cloudformation support for templating websocket API gateways https aws amazon com about aws whats
  • JFreechart 中漂亮的饼图

    是否有可能在 JFreechart 中为饼图获得复杂 漂亮的颜色 我的意思是我怎样才能获得如图所示的颜色link http upload wikimedia org wikipedia commons b bf Ml wiki photo
  • SVG 错误:访问属性“someFunction”的权限被拒绝

    请看一下这个小提琴 http jsfiddle net arasbm Tyxea 14 http jsfiddle net arasbm Tyxea 14 正如你所看到的 我想在 SVG 元素上触发事件时对其进行转换 您可以单击箭头 它应该
  • 复制二进制文件的内容

    我正在设计一个图像解码器 作为第一步 我尝试复制使用 c 即打开文件 并将其内容写入新文件 下面是我使用的代码 while c getc fp EOF fprintf fp1 c c 其中 fp 是源文件 fp1 是目标文件 程序执行时没有
  • 字母数字和 + 字符的正则表达式

    我需要一个仅允许字母数字加上 和 字符的正则表达式 现在我正在使用 w 以下模式将匹配仅包含字母 数字 或 的字符串 包括 或 等国际字符 并且不包括 中包含的 字符 w p L p N 例子 string pattern p L p N
  • Azure AD 的访问令牌颁发者是 sts.windows.net 而不是 login.microsoftonline.com

    我正在尝试验证从 azure Active Directory 获取的访问令牌 我从以下位置获得了令牌https login microsoftonline com my tennant guid v2 0 返回的令牌中的发行者是https
  • 应用程序引擎 + 模块 + Maven 的开发工作流程

    我们最近将我们的应用程序引擎项目按照以下结构转换为模块 这个新的开发工作流程的问题是 我们必须在每次更改时重建 EAR 并重新启动应用程序引擎本地开发服务器 这使得每次我们更改代码并想要测试它时 我们都会浪费 30 秒到一分钟的时间 com
  • PorterDuffXfermode DST_IN 未按预期工作

    因此 我试图加快我们正在做的一些绘制 使用 alpha 透明度绘制弧的一部分 并尝试将整个弧缓存到单独的位图中 并使用 alpha 遮罩有选择地显示它 根据我所做的研究 Android 的 Xfermodes API 演示 这个例子 htt
  • Swagger UI 将身份验证令牌传递给标头中的 API 调用

    我是 Swagger 的新手 我正在使用 Swagger UI 生成 swagger 文档 我有两个 API 调用 第一个调用是根据用户名和密码生成令牌 第二次调用需要第一次调用生成的令牌 如何使用 Swagger UI 设置第二次调用的令
  • 如何创建 AvalonEdit 语法文件 (.xshd) 并将其嵌入到我的程序集中?

    我正在尝试为 AvalonEdit 定义一些自定义突出显示规则 似乎没有任何相关文档 有有关文件格式的一些文档 http www codeproject com KB edit AvalonEdit aspx 但没有介绍创建定义后如何实际加
  • 创建增量按钮,如果边距大于 2800 像素,该按钮将关闭

    我正在制作一个滑块 并且正在尝试弄清楚如何专门对按钮进行编程 我希望它在单击时以 700 像素的增量向左移动 但是一旦 marginLeft 大于 2800 像素 因为单击时它不会执行任何操作 现在我有以增量移动容器的部分 但我不确定如何制
  • pyspark - 合并 2 列集合

    我有一个 Spark 数据框 它有 2 列由函数collect set 形成 我想将这两列集合合并为一列集合 我应该怎样做呢 它们都是一组字符串 例如 我有两列是通过调用collect set形成的 Fruits Meat Apple Or
  • 如何用正确的行数填充表格以适应不同屏幕分辨率下的页面高度?

    我在前端开发了自己的网络管理 这是一个典型的 Admin 其中包含容器 左侧的一个菜单导航和右侧的正文内容 其中显示与单击的菜单项相关的结果 通常是表格 为了以 100 适合正文页面 获得表格中正确的行数或行数的最佳方法是什么 就我而言 我
  • 如何使用 Azure DevOps REST API 更新文件?

    我正在尝试更新test json文件托管在 Azure DevOps Repo 上 我正在使用逻辑应用程序 无法从文档中识别操作顺序 我想我需要 向以下地址发出 GET HTTP 请求Items端点 https learn microsof
  • PhpStorm 终端:Cygwin 颜色不起作用

    我有 PhpStorm 2016 2 并在 Shell 路径中添加了 Cygwin 如下所示 C cygwin64 bin env exe CHERE INVOKING 1 bin bash exe 它运行良好 但颜色不起作用 例如我有 3
  • EntityNotFoundException:Bean 已被删除 - 延迟加载失败

    我正在迈出 Play 的第一步 使用 Java 的框架 v2 1 rc1 现在我遇到了 ebean 的第一个问题 我有一个与其自身具有多对一关系的导航实体 当我尝试访问parentNavigation中的标题字段时 我收到以下错误 Enti
  • 通过 SSH 连接到位于 VPC 私有子网中的 AWS EC2 实例

    我已经研究这个问题几个小时了 也许这是不可能的 也许是不可能的 我在 AWS 中有一个 VPC 带有几个 EC2 实例和 Lambda 实例 截至目前 lambda 可以毫无问题地调用 ssh 等连接 EC2 服务器 我的 lambda 在
  • 自动初始化 Typescript 中字符串文字类型的成员字段

    如果我有课的话 class Foo type foo constructor public id number class Bar type bar constructor public id number type SomeUnion F
  • Java:JVM 可用的内核?

    Java中有这样的方法Runtime getRuntime availableProcessors 其中有以下 Javadoc 返回 Java 虚拟机可用的处理器数量 该值可能会在虚拟机的特定调用期间发生变化 价值实际上如何改变 例如 在什
  • Grails 将请求参数绑定到枚举

    我的 Grails 应用程序有大量的枚举 如下所示 public enum Rating BEST be GOOD go AVERAGE av BAD ba WORST wo final String id private RateType