2012-03-28 3 views
0

Я добавил следующий метод в моем классе User Domainошибка после добавления геттер в домене класса

String getNameAttribute(){ 
     return this.username; 
    } 

где имя пользователя является атрибутом класса домена. Я использую это для ведения журнала аудита, чтобы получить имя пользователя для его регистрации.

Но когда я запустить приложение, я получаю следующее исключение

012-03-27 23:01:17,646 [main] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a setter for property nameAttribute in class com.gra.register.User 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a setter for property nameAttribute in class com.gra.register.User 
    at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212) 
    at grails.web.container.EmbeddableServer$start.call(Unknown Source) 
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158) 
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy) 
    at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280) 
    at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy) 
    at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149) 
    at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy) 
    at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116) 
    at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy) 
    at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59) 
    at RunApp$_run_closure1.doCall(RunApp.groovy:33) 
    at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381) 
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415) 
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy) 
    at gant.Gant.withBuildListeners(Gant.groovy:427) 
    at gant.Gant.this$2$withBuildListeners(Gant.groovy) 
    at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) 
    at gant.Gant.dispatch(Gant.groovy:415) 
    at gant.Gant.this$2$dispatch(Gant.groovy) 
    at gant.Gant.invokeMethod(Gant.groovy) 
    at gant.Gant.executeTargets(Gant.groovy:590) 
    at gant.Gant.executeTargets(Gant.groovy:589) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a setter for property nameAttribute in class com.gra.register.User 
    ... 23 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a setter for property nameAttribute in class com.gra.register.User 
    ... 23 more 
Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property nameAttribute in class com.gra.register.User 
    ... 23 more 

Почему ищет инкубатор? что я делаю неправильно здесь? Спасибо заранее.

+0

Я нашел этот вопрос .. мол, нужно назвать функцию не начиная с получением в противном случае он пытается найти атрибут после доставай. –

ответ

2

Это не проблема 2.0, но в более ранних версиях. Когда вы добавляете публичное поле в класс Groovy (например, String firstName в классе домена), компилятор Groovy преобразует его в частное поле и публичный получатель и сеттер. В свойствах классов домена Grails по умолчанию по-прежнему сохраняются, но свойства определяются как согласованная пара getter/setter. Общественные поля создают это для вас, но вы могли бы сделать это трудный путь, как и в Java:

class Person { 
    private String name 

    String getName() { return this.name } 
    void setName(String name) { this.name = name } 
} 

Итак, когда вы добавляете поглотитель (или сеттер), это выглядит как половина геттерной/пара сеттер собственности и поскольку сеттер не существует, это проблема для GORM.

К счастью, исправление прост; добавить имя свойства вашего добытчика в transients список:

static transients = ['nameAttribute'] 
+0

Спасибо, Берт. Да, мы используем grails 1.3.7 в настоящее время и планируем скоро перейти на 2.0. На данный момент мне нужна функция, общая для всех классов домена для целей аудита, поэтому я назвал ее nameattributecall() во всем домене и возвратил соответствующее поле «имя» этого домена. поэтому вызов функции является commmon во всех доменах ... –

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