Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Это не помогает перезапуску в режиме разработки, который у вас есть, но именно так я решил эту проблему. Это некрасиво и, вероятно, не очень хорошая практика, но я делю общий код на классы как замыкания. Тогда я могу сделать что-то вроде:
new ControllerClosures().action(this)
и из с в классе controllerClosures
def action={
it.response.something
return [allYourData]
}
Один из вариантов, который мне нравится, - написать общие методы в виде категории, а затем при необходимости смешать их с контроллерами. Он дает гораздо больше гибкости, чем наследование, имеет доступ к таким вещам, как params, а код прост и понятен.
Вот небольшой пример:
@Category(Object)
class MyControllerCategory {
def printParams() {
println params
}
}
@Mixin(MyControllerCategory)
class SomethingController {
def create = {
printParams()
...
}
def save = {
printParams()
}
}
Вы можете использовать шаблон проектирования Делегирование :
class Swimmer {
def swim() { "swimming" }
}
class Runner {
def run() { "running" }
}
class Biker {
def bike() { "biking" }
}
class Triathlete {
@Delegate Swimmer swimmer
@Delegate Runner runner
@Delegate Biker biker
}
def triathlete = new Triathlete(
swimmer: new Swimmer(),
runner: new Runner(),
biker: new Biker()
)
triathlete.swim()
triathlete.run()
triathlete.bike()
В случае контроллера назначьте класс помощника непосредственно в поле экземпляра (или в нулевом конструкторе):
class HelperClass {
def renderFoo() { render 'foo' }
}
class FooController {
private @Delegate HelperClass helperClass = new HelperClass()
def index = { this.renderFoo() }
}
Информация о типе делегата компилируется в содержащий класс.