是否可以在grails中按名称对枚举进行数据绑定?

时间:2015-11-11 15:39:58

标签: grails

我已经在grails中搜索了一个名称枚举的例子,但是我找不到任何名字。我想在请求中传递枚举名称并将枚举绑定为动作的参数。我需要自动绑定,即绑定而不显式调用Enum.valueOf(params.val)

是否可以在grails中按名称自动数据绑定枚举?如果是,我怎么能实现这个目标?我使用的是grails 2.5.1

5 个答案:

答案 0 :(得分:1)

我正在使用2.4.5所以也许有些东西已经改变了,但是直接因为Enums无法使用反射进行实例化而这是不可能的,这就是幕后发生的事情。

ControllersApi的{​​{1}}方法中,检查绑定类是否为域类 - initializeCommandObject,并且失败。

同样的方法尝试isDomainClass类型:

newInstance()

抛出一个} else if (requestMethod == HttpMethod.POST || !isDomainClass) { commandObjectInstance = type.newInstance(); } ,再次被抓住并重新抛出。有趣的是,在重新抛出异常之前,它会在控制器中查找匹配的异常处理方法。

InstantiationException

这将“成功”执行,但在这种情况下几乎没有价值。

答案 1 :(得分:1)

May be you can try BindUsing annotation, something like

@BindUsing({ quarter, source ->
Enum.valueOf(source['val'])
    })
Enum val

http://mrhaki.blogspot.in/2015/04/grails-goodness-custom-data-binding.html

答案 2 :(得分:0)

如果你有一个如下所示的简单枚举:

enum SomeEnum {
    ONE, TWO, THREE
}

具有相应属性的类:

class SomeDomain {
    SomeEnum someEnum
}

绑定器可以将String绑定到someEnum属性并为您进行转换......

new SomeDomain(someEnum: 'ONE')

答案 3 :(得分:0)

我找到了答案:

控制器动作的数据绑定仅支持两类:基本类型(基元)和命令对象,因此默认情况下不支持枚举。

From Grails 2.5.1 docs:

  

控制器操作参数受请求参数数据绑定的约束。有两类控制器动作参数。第一类是命令对象。复杂类型被视为命令对象。有关详细信息,请参阅用户指南的“命令对象”部分。另一类是基本对象类型。支持的类型是8个原语,它们对应的类型包装器和java.lang.String。

对于grails中枚举的支持数据绑定(按名称是默认值),您必须在命令对象中使用枚举

答案 4 :(得分:-1)

是的,有可能。如果我没记错的话,诀窍是为枚举定义一个构造函数,它将代码作为属性并创建相应的枚举。

现在将action参数的数据类型指定为枚举。