2017-01-16 1 views
0

Je souhaite utiliser deux résolveurs de vue de modèle différents dans mon application Spring mvc. Par exemple, kotlin et javascript en même temps. La création de 2 beans ViewResolver n'est pas un problème. Il semble impossible d'utiliser deux ScriptTemplateConfigurer car ScriptTemplateConfig est en cours d'acquisition dans ScriptTemplateView.autodetectViewConfig par ScriptTemplateConfig.class à partir du contexte Spring.ScriptTemplateViewResolvers multiples dans l'application Spring MVC

Existe-t-il un moyen d'utiliser deux moteurs de script en même temps ou cette fonctionnalité n'est pas prise en charge actuellement?

Répondre

0

Actuellement scriptTemplateConfig est extrait du contexte, il n'y a donc aucun moyen de forcer ScriptTemplateView à utiliser ScriptTemplateConfigurer spécifique.

Mais cela peut être facilement remplacé en ajoutant la propriété scriptTemplateConfig à ScriptTemplateView. Voici donc le ScriptTemplateView personnalisé:

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

} 

Une autre amélioration qui est nécessaire est la mise scriptTemplateConfig à ce point de vue. Je fais cela dans résolveur vue personnalisée et la mise à vue sur la création:

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

} 

Enfin, nous pouvons utiliser ce genre de choses en passant configurateur à 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; 
} 

Vous pouvez vérifier un échantillon in the repo