Spring MVC应用程序中的多个ScriptTemplateViewResolvers

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

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

目前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; } 

您可以在回购中查看样品