【问题标题】:Multiple ScriptTemplateViewResolvers in Spring MVC appSpring MVC 应用程序中的多个 ScriptTemplateViewResolver
【发布时间】:2017-01-16 13:59:21
【问题描述】:

我想在我的 Spring mvc 应用程序中使用两个不同的模板视图解析器。例如同时使用 kotlin 和 javascript。 创建 2 个 ViewResolver bean 不是问题。 似乎不可能使用两个 ScriptTemplateConfigurer,因为 ScriptTemplateConfig 是由 Spring 上下文中的 ScriptTemplateConfig.class 在ScriptTemplateView.autodetectViewConfig 中获取的。

有没有办法同时使用两个脚本引擎或者这个功能目前不支持?

【问题讨论】:

    标签: java spring spring-mvc template-engine


    【解决方案1】:

    目前 scriptTemplateConfig 取自上下文,因此无法强制 ScriptTemplateView 使用特定的 ScriptTemplateConfigurer。

    但这可以通过将属性 scriptTemplateConfig 添加到 ScriptTemplateView 来轻松覆盖。所以这里是自定义的 ScriptTemplateView:

    public class MyScriptTemplateView extends ScriptTemplateView {
    
        private ScriptTemplateConfig scriptTemplateConfig;
    
        public void setScriptTemplateConfig(ScriptTemplateConfig scriptTemplateConfig) {
            this.scriptTemplateConfig = scriptTemplateConfig;
        }
    
        @Override
        protected ScriptTemplateConfig autodetectViewConfig() throws BeansException {
            ScriptTemplateConfig res = scriptTemplateConfig;
            if (res == null) {
                res = super.autodetectViewConfig();
            }
            return res;
        }
    
    }
    

    需要的另一个增强功能是将 scriptTemplateConfig 设置为此视图。我在自定义视图解析器中执行此操作并将其设置为在创建时查看:

    public class MyScriptTemplateViewResolver extends ScriptTemplateViewResolver {
    
        private ScriptTemplateConfig scriptTemplateConfig;
    
        public void setScriptTemplateConfig(ScriptTemplateConfig scriptTemplateConfig) {
            this.scriptTemplateConfig = scriptTemplateConfig;
        }
    
        @Override
        protected AbstractUrlBasedView buildView(String viewName) throws Exception {
            MyScriptTemplateView view = (MyScriptTemplateView) super.buildView(viewName);
            view.setScriptTemplateConfig(scriptTemplateConfig);
            return view;
        }
    
        @Override
        protected Class<?> requiredViewClass() {
            return MyScriptTemplateView.class;
        }
    
    }
    

    最后,我们可以通过将配置器传递给 ViewResolver 来使用这些东西:

    @Bean
    public ScriptTemplateConfigurer kotlinConfigurer() {
        ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
        configurer.setEngineName("kotlin");
        configurer.setScripts("scripts/render.kts");
        configurer.setRenderFunction("render");
        configurer.setSharedEngine(false);
        return configurer;
    }
    
    @Bean
    public ViewResolver kotlinViewResolver(ScriptTemplateConfigurer kotlinConfigurer) {
        MyScriptTemplateViewResolver viewResolver = new MyScriptTemplateViewResolver();
        viewResolver.setPrefix("templates/");
        viewResolver.setSuffix(".kts");
        viewResolver.setScriptTemplateConfig(kotlinConfigurer);
        return viewResolver;
    }
    

    您可以查看示例in the repo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多