gpt4 book ai didi

Grails 2.5 :domainObj. validate() 方法在 domainObj.properties=params 时返回 false

转载 作者:行者123 更新时间:2023-12-02 15:50:59 26 4
gpt4 key购买 nike

我正在尝试将我的 grails 应用程序从 1.3 版升级到 2.5 版。我有一个域类,其中一个字段是枚举。在 Controller 中,当我执行 domainObj.validate() 时,它总是返回 false。验证错误是 -

grails.validation.ValidationErrors:1 个错误
字段“typeEnum”上的对象“参数”中的字段错误:拒绝值 [0];代码 [com.TypeEnum.typeMismatch.error,com.TypeEnum.typeMismatch,com.TypeEnum.typeMismatch.error,com.TypeEnum.typeMismatch,typeMismatch.com.TypeEnum,typeMismatch.pspValueTypeEnum,typeMismatch.com.TypeEnum,typeMismatch];参数 [typeEnum];默认消息 [No enum constant com.TypeEnum.0]

编辑 : 进一步分析,我发现问题不在于枚举,而是在执行 parameterObj.properties = params 时,parameterObj.validate() 返回 false。

在我使用 Grails 2.5 的代码中,

parameterObj.validate()   //returns true

parameterObj.properties = params
// code to convert String from params to Enum object and assign it to parameterObj
parameterObj.enumField = MyEnumClass.getEnumByName(params.enumNameValue)
parameterObj.validate() //This always return false

注意:以上两种validate()的情况,parameterObj的字段值是完全相同的

在 Grails 2.5 中使用域类的属性是否有任何变化?

最佳答案

如果您更改 View ,以便它们将枚举的 name() 作为参数值发送,则数据绑定(bind)开箱即用。

至少这就是我一直使用枚举的方式。

枚举数据绑定(bind) name()

<g:select name="typeEnum" from="${TypeEnum.values()}" value="${obj.typeEnum}"/>

然后 grails 使用每个枚举值的 .name() 作为值,使用 .toString() 作为显示的文本。这将产生如下内容:
<select name="typeEnum">
<option value="STRING">String</option>
<option value="NUMBER">Number</option>
...
</select>

然后 Controller 中的数据绑定(bind)可以很好地与域或命令对象一起工作:
def save1(PsparameterCmd cmd) {
...
instance.properties = cmd.properties
}
def save2() {
...
instance.properties = params
}

自定义枚举数据绑定(bind)

或者,您可以使用自定义数据绑定(bind)将 ID 转换为枚举值。

有不同的方法(文档: http://docs.grails.org/2.5.0/guide/theWebLayer.html#dataBinding):
* 您可以为该类型注册一个全局数据绑定(bind)器(如果您在应用程序中经常使用该枚举)
* 您可以在该单个字段上指定 dataBinding 注释(用于单一用途)
class Psparameter implements java.io.Serializable {
@BindUsing({ obj, params ->
return TypeEnum.values().find({ it.id == params.int('typeId') })
})
TypeEnum typeEnum
...
}

或全局转换器:
import org.grails.databinding.converters.ValueConverter
class TypeEnumConverter implements ValueConverter {
boolean canConvert(value) {
value instanceof Integer
}
def convert(value) {
return TypeEnum.values().find({ it.id == value })
}
Class<?> getTargetType() {
TypeEnum
}
}

您必须在 resources.groovy 中注册
beans = {
typeEnumConverter(your.package.TypeEnumConverter)
}

注意:据我所知(并且刚刚测试过),没有像 TypeEnum.getTypeEnumById(value) 这样的通用方法。这就是为什么我在上面的示例中对 TypeEnum.values() 使用 find 的原因。

关于Grails 2.5 :domainObj. validate() 方法在 domainObj.properties=params 时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39447552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com