Как вы разделяете общие методы в разных контроллерах Grails?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
26
задан fabien7474 16 November 2010 в 15:00
поделиться

3 ответа

Это не помогает перезапуску в режиме разработки, который у вас есть, но именно так я решил эту проблему. Это некрасиво и, вероятно, не очень хорошая практика, но я делю общий код на классы как замыкания. Тогда я могу сделать что-то вроде:

new ControllerClosures().action(this)

и из с в классе controllerClosures

def action={
    it.response.something
    return [allYourData]
}
3
ответ дан cdeszaq 16 November 2010 в 15:00
поделиться

Один из вариантов, который мне нравится, - написать общие методы в виде категории, а затем при необходимости смешать их с контроллерами. Он дает гораздо больше гибкости, чем наследование, имеет доступ к таким вещам, как params, а код прост и понятен.

Вот небольшой пример:

@Category(Object)
class MyControllerCategory {
    def printParams() {
        println params
    }
}

@Mixin(MyControllerCategory)
class SomethingController {

    def create = {
        printParams()
        ...
    }

    def save = {
        printParams()
    }
}
22
ответ дан ataylor 16 November 2010 в 15:00
поделиться

Вы можете использовать шаблон проектирования Делегирование :

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() }
}

Информация о типе делегата компилируется в содержащий класс.

2
ответ дан robbbert 16 November 2010 в 15:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: