根据会话属性值从动态模板路径动态选择模板

时间:2017-11-26 01:22:08

标签: spring spring-mvc spring-boot

我正在使用spring boot 1.5,并希望根据基于会话变量值的路径选择模板。

例如,如果我有一个目录/ templates /,它是所有模板的根目录。 如果会话属性“port”包含值“2023”,我希望将根模板目录更改为/ templates / 2023 /。 如果session属性不存在或生成的根路径不存在,则根模板目录为/ templates / default /。

我如何做到这一点。此解决方案的任何示例或类似问题的解决方案将不胜感激。

1 个答案:

答案 0 :(得分:0)

无法动态修改模板解析器配置,然后使用新设置重新初始化它。查看ThymeleafView的源代码,如果模板引擎在视图本身的呈现阶段尚未初始化,则会强制初始化模板引擎

protected void renderFragment(final IFragmentSpec fragmentSpecToRender, final Map<String, ?> model, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
    // ...
    // ...
    if (!viewTemplateEngine.isInitialized()) {
        viewTemplateEngine.initialize();
    }
    // ...
    // ...
}

这会将initialized标志设置为true,并在尝试改变已初始化的模板解析器时随处检查。

所以最好的办法是将路径与控制器要求模板解析器呈现的视图名称一起返回

// ...
String port = (String) session.getAttribute("port");

return (port == null ? "default" : port) + "/mytemplate";
// ...

您的templateResolver前缀应设置为所有变量路径的父级templates/

templateResolver.setPrefix("templates/");