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
我想在我的 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