2011-07-06 19 views
1

をレンダリングするために渡された静的メンバを再生します私の問題の光。は、私はしばらくの間、私のテンプレートでNullPointerExceptionで苦労してきたと私はここで誰かがいくつかを当てることができることを願っていますので、オンラインで任意のヘルプを見つけることができていないフレームワークテンプレートエンジン、原因NullPointerExceptionが

私はすべての私の他のコントローラが拡張私自身の「ベースController」を作成しました。私は私のテンプレートに、この静的なセッションメンバーを渡す必要が ...私の問題に

public class Home extends SessionController { 
... 
} 

public class SessionController extends Controller { 
    protected static SessionDao siteSession; 
} 

: ベースコントローラは、ユーザーのセッション(いないプレイセッションが、DBモデル)を保持している静的メンバが含まれています。ホームで 私は次のようにします。

public class Home extends SessionController { 

    public static void index() { 
     render(siteSession); 
    } 
} 

そして、私のテンプレートで、私が行います

${siteSession.search.query} 

これは(私はそれはそれを渡す前に、コントローラに正しく設定されていると確信してsiteSessionにNullPointerExceptionが発生しますレンダリングする())。私はかなりいじりや仕事に以下を取得するために管理してきた

public class Home extends SessionController { 

    public static void index() { 
     // Just setting mySession to siteSession 
     SessionDao mySession = siteSession; 
     render(siteSession); 
    } 
} 

そして、私のテンプレートで私がやる:私はmySessionを使用

${mySession.search.query} 

注意をテンプレートと私はまだ私のアクションでrender()にsiteSessionを渡します。何らかの理由でこれが機能し、セッションオブジェクトが取得され、すべて正常ですが、これは実際にこれを行う方法にはなりません。レンダリング()に渡されたことがないので、テンプレート内のmySessionにアクセスすることすらできません。

誰かが、私はそれを非常に感謝し、この上でいくつかの光を当てることができます。


私の好みのシナリオは、SessionControllerにレンダリングをオーバーライドさせ、siteSessionオブジェクトをテンプレートエンジンに「自動的に」渡すことです。誰もが、私は(このスニペットは動作しません)私が試したし、テンプレート内の任意およびすべてのオブジェクトへのアクセスを得ることができなかったてきたように、私はそれを感謝することをやって行く方法上の任意の提案をしている場合:

public class Home extends SessionController { 
    public static void render(Object ... args) { 
     if (args == null) { 
     args = new Object[1]; 
     } 
     args[args.length] = siteSession; 
     Controller.render(args); 
    } 
} 

答えて

3

私はmySessionオブジェクトを使用すると、レンダリング()メソッドを介してそれを渡していないとき、あなたのテンプレートで利用可能ですが、あなたは自動的にテンプレートに渡されたオブジェクトを取得することができますどのようにあなたの質問に答えるために、かなり簡単です理由はわかりません。

ベースコントローラで、@Before注釈で注釈を付けられたメソッドを作成し、必要なオブジェクトをrenderArgsオブジェクトに追加します。例えば... renderArgsオブジェクトの詳細情報については

public class SessionController extends Controller { 
    protected static SessionDao siteSession; 

    @Before 
    static void populateRenderArgs() { 
     renderArgs.put("siteSession", siteSession); 
     // etc... add any other global template arguments here 
    } 
} 

check hereと探し節「は、テンプレートスコープにデータを追加します」。完全に問題を解決し

+0

こんにちは、。どうもありがとう。あなたが言うように、それはまだmySession突然のすべてが使用可能ですが、siteSessionあなたは、少なくともテンプレートでアクセスsiteSessionを作ったことを提案方法追加した理由を説明しません。 – polythene

+0

ドキュメントとして、私がdocumentSessionを渡すことができないことを知っていたので、レンダリングにローカル変数だけを渡すことができると明示的に言いました。 – polythene

+0

次の作業を行いますか?SessionDao localSiteSession = siteSessionを宣言してからrenderArgsに渡します – emt14

関連する問題