【问题标题】:Play Framework Template Engine, static member passed to render cause NullPointerException播放框架模板引擎,传递给渲染的静态成员导致 NullPointerException
【发布时间】:2011-07-07 04:15:20
【问题描述】:

我的模板中出现 NullPointerException 已经有一段时间了,并且无法在网上找到任何帮助,所以我希望这里的人可以对我的问题有所了解。

我创建了自己的“基本控制器”,所有其他控制器都对其进行了扩展。 基本控制器包含一个静态成员,它持有用户会话(不是播放会话,而是一个数据库模型):

public class Home extends SessionController {
...
}

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

我的问题... 我需要将此静态会话成员传递给我的模板。 在 Home 中,我执行以下操作:

public class Home extends SessionController {

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

然后在我的模板中执行:

${siteSession.search.query}

这会在 siteSession 上导致 NullPointerException(我确信在将它传递给 render() 之前它已在 Controller 中正确设置)。

我已经搞砸了很多,并设法让以下工作:

public class Home extends SessionController {

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

然后在我的模板中执行:

${mySession.search.query}

请注意,我在模板中使用了 mySession,并且在我的操作中仍然将 siteSession 传递给 render()。出于某种原因,这行得通,我得到了我的会话对象,一切都很好,但这并不是真正的方法。我什至无法访问模板中的 mySession,因为它从未传递给 render()。

如果有人能对此有所了解,我将不胜感激。


我的首选方案是让 SessionController 覆盖渲染并将 siteSession 对象“自动”传递给模板引擎。如果有人对我如何做这件事有任何建议,我将不胜感激,因为我已经尝试过并且无法访问模板中的任何和所有对象(此 sn-p 不起作用):

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

【问题讨论】:

    标签: playframework


    【解决方案1】:

    我不知道为什么 mySession 对象在您没有通过 render() 方法传递时在您的模板中可用,但要回答您关于如何将对象自动传递到模板中的问题,是相当琐碎。

    在您的基本控制器中,创建一个带有@Before 注释的方法,并将所需的对象添加到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
        }
    }
    

    有关 renderArgs 对象的更多信息,check here 并查找“将数据添加到模板范围”部分。

    【讨论】:

    • 嗨,完美解决了这个问题。非常感谢。正如您所说,它仍然没有解释为什么 mySession 突然可用,但是按照您建议的方式添加 siteSession 至少使 siteSession 在模板中可访问。
    • 我在阅读文档时才意识到,我无法按照我尝试的方式将 siteSession 传递给 render(),因为文档明确表示只能将局部变量传递给 render。跨度>
    • 以下工作是否有效:声明 SessionDao localSiteSession = siteSession 然后将其传递给 renderArgs
    • 从哪里来的?关键是要有一个使用@before 执行的方法。然后,您可以将任何对象映射到 renderargs 映射中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多