Spring MVC 应用中的多个 ScriptTemplateViewResolver

Multiple ScriptTemplateViewResolvers in Spring MVC app

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

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

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