【问题标题】:get the field by field name and set value to it通过字段名称获取字段并为其设置值
【发布时间】:2014-09-09 15:10:42
【问题描述】:

我想为域类中的一个字段设置一个值。 例如,

class Example {
   String name
   String lastName
}

现在,我从响应中获取域名、对象实例 ID、字段名称和值。我必须将值设置为域类中的字段。

这里我得到的值是

domainName = 'Example'
instanceId = 1
fieldName = 'name'
valueToSet = 'XYZ'

那么我应该如何设置字段名称的值呢?可能这很简单,但我是 grails 和 groovy 的新手。

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    根据域名,必须在运行时创建一个新的域实例。为此,必须注入grailsApplication。这是一个可以在 Controller 或 Service 类中建模的示例:

    class SomeService {
        def grailsApplication
    
        def someMethod(String domainName, long instanceId, 
                       String fieldName, def valueToSet) {
    
            Class domainClazz = grailsApplication.domainClasses.find { 
                it.clazz.simpleName == domainName 
            }.clazz
    
            def domainInstance = domainClazz.get( instanceId )
            domainInstance."$fieldName" = valueToSet
    
            domainInstance.save()
        }
    }
    

    【讨论】:

    • 我试过了,效果很好。但它适用于字符串值。我应该怎么做才能让它也适用于其他数据类型?
    • 好问题。我期待你提出这个问题,你问这个很好。只需将someMethod 的签名更改为def valueToSet 而不是String。这确保了valueToSet 的静态类型为Object 并且实际类型是在运行时决定的。
    【解决方案2】:

    您可以通过将映射分配给其属性来填充 Grails 域类,例如从控制器中的参数(使用方便的自动绑定)。例如:

    ded 示例=新示例() example.properties=params

    所以从这里可以看出,域对象可以被视为一组属性。这意味着您可以使用字符串作为键,因此您可能会有类似的内容:

    示例['name']='XYZ'

    我不知道这是否是您要问的,但我希望它有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多