Import spring.ftl using Spring MVC, Sitemesh, Freemarker

How to import spring.ftl macros into a Freemarker template page using Spring MVC, Sitemesh and Freemarker?

I set up a Spring MVC application using Sitemesh and Freemarker based on the Ted Young configuration example . According to the Spring MVC / Freemarker integration link, you need to import spring.ftl macros to bind the backup model to the view via <lt; @ spring.bind "command.name" / ">. However, by doing this:

<#import "/spring.ftl" as spring>
<@spring.bind "command.user"/>

Results in this exception:

org.springframework.web.util.NestedServletException: 
Request processing failed; nested exception is freemarker.
template.TemplateException: Error reading imported file spring.ftl

Others ran into this problem , but I haven't found a solution on google land yet. I also tried using this technique (zipping up spring.ftl, putting it in META-INF / lib and adding zip to the build path), but it didn't seem to work.

Thank!

+5
source share
3 answers

The problem is that spring doesn't know where to look for the file spring.ftl: This is my custom configuration for an MVC project using Boot

/**
 * Otras configuraciones de la aplicaciones web, incluyendo algunas definidas en
 * xml. Usar @ImportResource("classpath:/extra-config.xml") en caso de quererse
 * importar configuracion en xml
 */
@Configuration 
@PropertySource("classpath:application.properties")
public class WebAppConfig
{
    @Autowired
    private ServletContext context;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer placeHolderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
        return placeHolderConfigurer;
    }

   @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException 
    {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer()
        {

            @Override
            protected void postProcessConfiguration(freemarker.template.Configuration config) throws IOException, TemplateException
            {
                WebappTemplateLoader WebAppTplLoader = new WebappTemplateLoader(context, "/WEB-INF/ftl");
                ClassTemplateLoader classTplLoader = new ClassTemplateLoader(context.getClassLoader(), "/templates");
                ClassTemplateLoader baseMvcTplLoader = new ClassTemplateLoader(FreeMarkerConfigurer.class, "");
                MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[]
                {
                    WebAppTplLoader,
                    classTplLoader,
                    baseMvcTplLoader
                });  
                config.setTemplateLoader(mtl);
            }
        };
        configurer.setDefaultEncoding("UTF-8"); 
        configurer.setPreferFileSystemAccess(false); 
        return configurer; 
    }

    @Bean
    public FreeMarkerViewResolver viewResolver()
    {
         FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); 
         viewResolver.setExposeSpringMacroHelpers(true);  
         viewResolver.setExposeRequestAttributes(true);
         viewResolver.setPrefix("");
         viewResolver.setSuffix(".ftl");
         viewResolver.setContentType("text/html;charset=UTF-8");
         return viewResolver;
    }
}

2 .ftl war "/WEB-INF/ftl" jar src/resources/templates. freemarker, escense :

         viewResolver.setExposeSpringMacroHelpers(true);  
         viewResolver.setExposeRequestAttributes(true);

baseMvcTplLoader, spring.ftl org.springframework.web.servlet.view.freemarker. ftl , spring.ftl.

freemarker , src/resources/application.properties @Value.

spring freemarker.

+2

spring.ftl, , . .

freemarkerConfigurer .

   @Bean(name = "freemarkerConfig")
public FreeMarkerConfigurer freemarkerConfig() {
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
    configurer.setTemplateLoaderPath("/WEB-INF/views/");
    Map<String, Object> map = new HashMap<>();
    map.put("xml_escape", new XmlEscape());
    configurer.setFreemarkerVariables(map)
    def settings = new Properties()
    settings['auto_import']  =  'spring.ftl as spring, layout/application.ftl as l'
    configurer.setFreemarkerSettings(settings)
    println "returning freemarker config"
    return configurer;
}
0
<#import "spring.ftl" as spring/>

Without /

-2
source

All Articles