Метод Grails getSomething (int i) не компилируется - PullRequest
4 голосов
/ 28 декабря 2008

Может кто-нибудь сказать мне, почему этот класс домена Grails не будет компилироваться (во время выполнения)?

class Person {
    String name

    String getSomething(int i) {
    }
}

Я получаю эту ошибку при запуске с grails run-app:

2008-12-27 15:26:33.955::WARN:  Failed startup of context org.mortbay.jetty.webapp.WebAppContext@187e184{/asrs2,C:\Steve\asrs2/web-app}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
        at java.security.AccessController.doPrivileged(Native Method)
        at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy:67)
        at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy)
        at Init_groovy$_run_closure6.doCall(Init_groovy:131)
        at RunApp_groovy$_run_closure2.doCall(RunApp_groovy:66)
        at RunApp_groovy$_run_closure2.doCall(RunApp_groovy)
        at RunApp_groovy$_run_closure1.doCall(RunApp_groovy:57)
        at RunApp_groovy$_run_closure1.doCall(RunApp_groovy)
        at gant.Gant.dispatch(Gant.groovy:271)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.processTargets(Gant.groovy:436)
        at gant.Gant.processArgs(Gant.groovy:372)
Caused by: java.lang.NullPointerException
        at java.lang.Class.isAssignableFrom(Native Method)
        ... 13 more

Если я изменю метод getSomething на doSomething, тогда он будет работать. getSomething(int i) как-то трактуется как метод бина?

Продолжение : это ошибка Grails , которая будет исправлена ​​в 1.2.

Ответы [ 5 ]

7 голосов
/ 02 января 2009

Ну, у вас есть две проблемы:

  1. Доменные классы в Grails стараются удостовериться, что каждое свойство имеет геттер и сеттер во время запуска. Это делается путем поиска всех получателей и проверки наличия соответствующего установщика. Таким образом, если у вас есть getSomething (), вы должны иметь setSomething (def что-то) , даже если в классе нет свойства «что-то». Действительно, создав функцию getSomething (), вы подразумеваете , что такое свойство существует, и вы также должны создать setSomething ().

  2. Получатели не принимают аргументы . Ваш делает. Теперь я понимаю, что вы не думали, что это был «добытчик», когда вы его написали, но ваше название делает его единым целым.

Лучшая ставка? Не используйте префиксы «get», «set» или «is», если вы действительно не делаете полное свойство, которое можно получить и установить. Я бы также избегал «находить» в классах домена, поскольку у него есть собственный набор сгенерированных методов.

5 голосов
/ 22 января 2009

Пара заметок ...

  • Если вы предоставляете установщик, вам также не нужно указывать его. И наоборот. Что вы на самом деле делаете, так это переопределяете методы доступа по умолчанию, которые Groovy подключает для вашего. Вы можете переопределить одно, а не другое, если хотите.
  • Нет проблем, если вы создадите метод для своего класса домена, начинающийся с 'find', потому что методы динамического поиска на самом деле являются дополнениями статических методов (и все они начинаются с 'findBy *').
  • Решение по переходным процессам не будет работать. Создание «чего-то» временного значения не помогает тому факту, что у вас получатель с неправильной сигнатурой параметра. То же самое, когда вы динамически вводите возвращаемое значение.
  • Это не проблема для Groovy, а для Grails.

Я думаю, что решение состоит в том, чтобы изменить имя вашего метода с getSomething на findSomething или что угодно, что не идет вразрез с соглашением. Следующее работает отлично:

class Person {
    String name

    String findSomething(int i) {
    }
}
4 голосов
/ 22 января 2009

Вместо определения метода как возвращаемого типа попробуйте просто использовать def:

class Person {
    String name

    def getSomething(int i) {
        // foo
    }
}

Другое решение может состоять в том, чтобы определить something как переходный процесс (при условии, что у вас фактически нет свойства, называемого «что-то»):

class Person {
    String name

    static transients = ['something']

    String getSomething(int i) {
        // foo
    }
}
1 голос
/ 15 января 2010

Я пришел к выводу, что это ошибка с Grails. Я создал GRAILS-3760 , который был исправлен в Grails 1.1.2.

1 голос
/ 28 декабря 2008

Прежде чем я отвечу на вопрос, позвольте мне рассказать вам о моем окружении:
Grails 1.0.4
Java 1.6.0_10-бета
Groovy 1.6-RC-1
на компьютере с Windows Vista

В Grails динамические методы get добавляются во время выполнения для всех полей в классе домена. Для класса Person, упомянутого в вопросе, во время выполнения будет добавлен метод getName (), который позволит использовать его без определения. Теперь проблема с getSomething (int i) в том, что у вас нет поля с именем String что-то в вашем классе. Если вы попытаетесь добавить метод getName (int i), он будет работать без проблем или если вы добавите поле String что-то тогда метод getSomething () будет работать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...