基本的に、フィルター内で作成されたオブジェクトを、すべてのコントローラーが拡張するベース コントローラーのメンバーに割り当てられるようにしたいと考えています。それを行う可能な方法はありますか?
これが私が試した方法ですが、機能させる必要はありません。
私が達成しようとしているのは、すべてのコントローラーに基本コントローラーを拡張させることです。基本コントローラーのコンストラクターは、メンバーに値を割り当てるために使用され、それらの値はセッションマップから取得されます。以下の例。
ファイル grails-app/controllers/HomeController.groovy:
class HomeController extends BaseController {
def index = {
render username
}
}
ファイル grails-app/controllers/BaseController.groovy:
abstract class BaseController {
public String username
public BaseController() {
username = session.username
}
}
アプリを実行すると、次のような出力が表示されます。
2010-06-15 18:17:16,671 [main] ERROR [localhost].[/webapp] - Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
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.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
...
Caused by: java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
...
Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Could not create a new instance of class [com.my.package.controller.HomeController]!
...
Caused by: groovy.lang.MissingPropertyException: No such property: session for class: com.my.package.controller.HomeController
at com.my.package.controller.BaseController.<init>(BaseController.groovy:16)
at com.my.package.controller.HomeController.<init>(HomeController.groovy)
...
2010-06-15 18:17:16,687 [main] ERROR core.StandardContext - Error listenerStart
2010-06-15 18:17:16,687 [main] ERROR core.StandardContext - Context [/webapp] startup failed due to previous errors
そして、アプリは実行されません。
これは単なる例です。私の場合、ユーザー名を文字列値に割り当てたくないので、セッションマップからいくつかのオブジェクトを取得します。セッションマップから取得されたオブジェクトは、フィルター内に設定されています。
私が見る代替手段は、フィルターの実行内でコントローラーのインスタンスにアクセスできることです。それは可能ですか?
助けてください!本当にありがとう!