2016-02-22 7 views
1

Я обновляю веб-приложение Grails 2.5.1 до grails 3, но я застрял в этой проблеме: в моих контроллерах я использовал beforeInterceptor s для предварительного расчета набора переменных, которые будут использоваться в их методах действий.Grails 3 - назначить переменную контроллера в перехватчике

class MyController { 

    def myVar 

    def beforeInterceptor = { 
     myVar = calculateMyVarFromParams(params) 
    } 

    def index() { 
     /* myVar is already initialized */ 
    } 
} 

Теперь, когда перехватчики Grails 3 более мощные и на отдельных файлах, как я могу достичь того же результата? Для того, чтобы избежать использования запроса области видимости переменных, я попытался с помощью следующего кода

class MyInterceptor { 

    boolean before() { 
     MyController.myVar = calculateMyVarFromParams(params) 
     MyController.myVar != null // also block execution if myVar is still null 
    } 

    boolean after() { true } 

    void afterView() { /* nothing */ } 
} 

class MyController { 

    def myVar 

    def index() { 
     println('myVar: '+myVar) 
    } 
} 

, но я получаю

ERROR org.grails.web.errors.GrailsExceptionResolver - MissingPropertyException occurred when processing request: [GET] /my/index 
No such property: myVar for class: com.usablenet.utest.MyController 
Possible solutions: myVar. Stacktrace follows: 
groovy.lang.MissingPropertyException: No such property: myVar for class: com.usablenet.utest.MyController 
Possible solutions: myVar 
at com.usablenet.utest.MyInterceptor.before(MyInterceptor.groovy:15) ~[main/:na] 

Я предположил (ошибочно, по-видимому), что это было бы возможно. Есть ли решение? Заранее спасибо!

Примечание: в моем случае MyController является абстрактным классом продлен всеми другими контроллерами

ответ

1

Что я пропускал это объявить myVar как static, так просто, как это!

Update
Если по какой-либо причине вы не можете определить переменную static, вы можете установить его в качестве атрибута request объекта в перехватчик, и читать его оттуда в контроллер

// Interceptor 
request.setAttribute('myVar', calculateMyVarFromParams(params)) 

// Controller 
request.getAttribute('myVar') 
Смежные вопросы