Grails - 如何在没有GORM附加字段的情况下获取对象域字段?

时间:2014-04-28 07:11:05

标签: grails gorm

为了对我的域类对象进行验证,我需要获取验证所需的所有相关字段。
我需要的确切字段是我自己在我的域类中定义的那些而不是GORM所做的那些。

我需要知道如何获得这些字段? 我的意思是,如何在没有' id','版本'的情况下获取所有字段。和所有其他GORM生成的字段。
谢谢!

2 个答案:

答案 0 :(得分:0)

域类实例上的constraints属性为您提供了ConstrainedProperty个对象的列表,这些对象表示域类中constraints块中列出的属性,按顺序排列列出(见this documentation page的底部)。

static constraints = {
  prop2()
  prop1(nullable:true)
  prop3(blank:true)
}

因此,如果你已经提到constraints块中的每个属性,那么你可以使用

myObj.constraints.collect { it.propertyName }

获取属性名称列表(在上面的示例中,您将获得[prop2, prop1, prop3])。

答案 1 :(得分:0)

你可以做几件事。

如果你有这样的域类:

// grails-app/domain/com/demo/Person.groovy
class Person {
    String firstName
    String lastName

    // notice that only firstName is constrained, not lastName
    static constraints = {        
        firstName matches: /[A-Z].*/
    }
}

您可以查询persistentProperties属性以获取所有持久属性的列表:

def person = new Person()
def personDomainClass = person.domainClass
// this will not include id and version...
def persistentPropertyNames = personDomainClass.persistentProperties*.name

assert persistentPropertyNames.size() == 2
assert 'firstName' in persistentPropertyNames
assert 'lastName' in persistentPropertyNames

如果你想做同样的事情但是没有Person类的实例来询问你可以做这样的事情:

def personDomainClass = grailsApplication.getDomainClass('com.demo.Person')
// this will not include id and version...
def persistentPropertyNames = personDomainClass.persistentProperties*.name

assert persistentPropertyNames.size() == 2
assert 'firstName' in persistentPropertyNames
assert 'lastName' in persistentPropertyNames

您还可以从约束Map中获取密钥:

// this will include both firstName and lastName,
// even though lastName is not listed in the constraints
// closure.  GORM has added lastName to make it non
// nullable by default.
// this will not include id and version...
def constrainedPropertyNames = Person.constraints.keySet()

assert constrainedPropertyNames.size() == 2
assert 'firstName' in constrainedPropertyNames
assert 'lastName' in constrainedPropertyNames

我希望有所帮助。