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