2013-11-13 4 views
2

Недавно я унаследовал базу кода Grails с классом домена Name с (среди прочих) свойствами first и last для представления первой и последней частей имени, соответственно , При написании модульного теста, который использовал этот домен, я столкнулся с некоторыми проблемами, связанными с именами этих свойств, которые были такими же, как методы first и last в пределах Grails. Теперь я могу исправить проблемы, переименовав свойства, но мне было интересно, есть ли способ в Grails использовать имена свойств first и last.Область Grails с «первым» и «последним» свойствами

А именно, ошибка, которую я получал, была No signature of method: com.example.Name.first() is applicable for argument types:() values: [] Possible solutions: first(), first(java.lang.String), first(java.util.Map), list(), list(java.util.Map), print(java.lang.Object), когда Grails пытается применить ограничение nullable: true к свойствам.

Вот источник Name:

class Name { 
    String first 
    String middle 
    String last 
    static belongsTo = [person : Person] 

    static constraints = { 
     first(nullable:true) 
     middle(nullable:true) 
     last(nullable:true) 
    } 

    public static Name findOrCreate(String first, String middle, String last){ 
     def name 
     name = Name.createCriteria().get{ 
      and{ 
       eq('first', first) 
       eq('middle', middle) 
       eq('last', last) 
      } 
     if(!name){ 
      name = new Name() 
      name.first = first 
      name.middle = middle 
      name.last = last 
     }  
     return name 
    } 

    static mapping = { 
     cache true 
    } 

} 
+0

Вы должны использовать 'name.first', чтобы получить первое имя экземпляра' Name'. Почему это должно противоречить 'Name.first()' каким-либо образом? – dmahapatro

+0

В блоке ограничений, когда Grails пытается применить «first (nullable: true)», выбрано исключение, указанное выше. – RandomMooCow

+0

Ваш метод 'findOrCreate' функционально идентичен этому методу, который добавляется GORM ко всем классам домена. Http://grails.org/doc/latest/ref/Domain%20Classes/findOrCreateWhere.html –

ответ

7

Вы говорите, что эта ошибка происходит в ограничении блока. В этом случае вы можете быть в состоянии заставить его работать с явным delegate., т.е.

static constraints = { 
    delegate.first(nullable:true) 
    // and similarly for last 
} 

, чтобы заставить first следует рассматривать в качестве вызова в DSL ограничений, а не к статическому методу Горм.

+0

Работает как очарование, спасибо большое! – RandomMooCow

+1

@RandomMooCow это полезный трюк, чтобы быть в курсе любого времени, когда вы столкнулись с именем DSL. Я часто использую это при написании XML с MarkupBuilder, если я хочу создать элемент с тем же именем, что и локальная переменная. –

Смежные вопросы