玩框架模板引擎,静态成员传递给渲染事业的NullPointerException(Play Fram

2019-09-30 03:37发布

我在我一会儿模板,一个NullPointerException挣扎着,所以我希望这里有人能阐明我的问题有些光一直没能找到任何在线帮助。

我创建了我自己的“基地控制器”,我的所有其他控制器扩展。 主控制器包含持有用户会话(不玩会话,但一个DB模式)的静态成员:

public class Home extends SessionController {
...
}

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

我的问题...我需要这个静态会议成员传递给我的模板。 在首页我做到以下几点:

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.search.query}

请注意,我在模板中使用MySession的,我还通过siteSession渲染()在我的行动。 出于某种原因,这个工程,我让我的session对象,一切都很好,但是这并不能真的是去这样做的方式。 我不应该甚至可以在模板访问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);
    }
}

Answer 1:

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

在您的基本控制器,创建注解与所述的方法@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对象的详细信息, 点击这里查看“ 数据添加到模板的范围 ”一节。



文章来源: Play Framework Template Engine, static member passed to render cause NullPointerException