0

基本的に、フィルター内で作成されたオブジェクトを、すべてのコントローラーが拡張するベース コントローラーのメンバーに割り当てられるようにしたいと考えています。それを行う可能な方法はありますか?

これが私が試した方法ですが、機能させる必要はありません。

私が達成しようとしているのは、すべてのコントローラーに基本コントローラーを拡張させることです。基本コントローラーのコンストラクターは、メンバーに値を割り当てるために使用され、それらの値はセッションマップから取得されます。以下の例。

ファイル 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

そして、アプリは実行されません。

これは単なる例です。私の場合、ユーザー名を文字列値に割り当てたくないので、セッションマップからいくつかのオブジェクトを取得します。セッションマップから取得されたオブジェクトは、フィルター内に設定されています。

私が見る代替手段は、フィルターの実行内でコントローラーのインスタンスにアクセスできることです。それは可能ですか?

助けてください!本当にありがとう!

4

3 に答える 3

4

通常、Grails アーティファクトのコンストラクターでできることはあまりありません。ただし、これにはインターセプターを使用できます。

abstract class BaseController {
   protected String username

   def beforeInterceptor = {
      username = session.username
   }
}

これについては、http: //grails.org/doc/latest/のセクション 6.1.5 で説明されています。

于 2010-06-15T23:46:05.597 に答える
0

原則として、コントローラーに状態を直接入れないように注意します。一般に、コントローラーは (フレームワークに関係なく) ステートレスであることを意図しています。データを保存および転送するために、リクエストやセッションなどの標準の webapp 状態構造に固執します。

あなたの特定のケースでは、次のいずれかを行います。

  • 軽量データ (プリミティブ) の場合は、それらをセッションに保存し、必要に応じてアクセスします。
    たとえば、session.username をレンダリングします。

  • 動的またはデータベース駆動型のデータの場合、サービスを作成し、必要に応じてデータを取得します。例: homeService.getUser().username

  • 上記の Burt との議論のバリエーションとして、フィルタを使用してリクエストまたはセッションの値を入力することもできます。

于 2010-06-16T19:57:50.580 に答える
0

リクエストスコープのサービスを使用できます...

于 2010-06-16T14:03:54.970 に答える