当前位置: 首页 > 知识库问答 >
问题:

如何使用java将spring标记库暴露给Freemaker配置并处理Freemarker模板类?

秦育
2023-03-14

我一直试图使用FreeMarker.Template.Template类来处理给定的。FTL模板。Basiclaly没有找到spring标记libs,当遇到第一个<@spring.url.../>标记时会失败。但是,它可以读取spring宏指令。

我使用的是Spring4和freemarker 2.3.23。在Tomcat7上运行我的Spring MVC应用程序时,它抱怨以下问题:

----FTL堆栈跟踪(“~”表示与嵌套相关):-在:@spring.url“/imports/app/vendor/boot...[在模板”config/pages/default-page.FTL“中,第5行,第54列]时失败----]根本原因FreeMarker模板错误:以下计算结果为null或缺失:==>spring[在模板”config/pages/default-page.FTL“中,第5行,第56列]

MVCConfiguration的代码扩展了WebMvcConfigurerAdapter

@Bean 
public FreeMarkerViewResolver freemarkerViewResolver() {
    LOGGER.debug("Executing freemarkerViewResolver()");
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setExposeSpringMacroHelpers(true);  
    resolver.setExposeRequestAttributes(true);
    resolver.setCache(true); 
    resolver.setPrefix(""); 
    resolver.setSuffix(".ftl");
    return resolver; 
}

@Bean(name="fmAdvanceConfigFactoryBean")    
public FreeMarkerConfigurer getFreemarkerConfig() throws IOException, TemplateException  {
    FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean = new FreeMarkerConfigurationFactoryBean();
    FreeMarkerConfigurer result = new FreeMarkerConfigurer();
    result.setTemplateLoaderPath("/WEB-INF/views");
    result.setConfiguration(freeMarkerConfigurationFactoryBean.createConfiguration());
    return result;
}   

模板处理块:

Template pageHTML = fmAdvanceConfigFactoryBean.getTemplate("config/pages/default-page.ftl");  
StringWriter pageWriter = new StringWriter();
Map<String, Object> map = new HashMap<>();
pageHTML.process(map, pageWriter);

我一直在寻找许多提供高级配置的页面,但没有一个能够解决这个问题。我不确定我在这里错过了什么。任何帮助都将是有用的和感激的!

    @Loggable
@Bean(name="fmAdvanceConfigFactoryBean")    
public FreeMarkerConfigurer getFreemarkerConfig() throws IOException, TemplateException  {
    Properties settings = new Properties(); 
    settings.setProperty("auto_import", "/spring.ftl as spring");
    FreeMarkerConfigurer result = new FreeMarkerConfigurer();
    result.setTemplateLoaderPaths("/WEB-INF/views","classpath:/");
    result.setFreemarkerSettings(settings);
    return result;
}

新错误:

严重:对于路径为[/ghpwebapp]的上下文中的servlet[dispatcher]的servlet.service()抛出异常[请求处理失败;嵌套异常为freemarker.core.invalidreferenceException:以下内容已计算为null或丢失:==>springMacroRequestContext[在模板“spring.ftl”中,第89行,第134列]

----提示:如果已知失败表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些仅覆盖表达式的最后一步;要覆盖整个表达式,

----FTL堆栈跟踪(“~”表示与嵌套相关):-在以下位置失败:${springMacroRequestContext.getcontex...[在模板“spring.FTL”中,在宏“url”中,在第89行,第132列]-通过:@spring.url“/imports/app/vendor/boot...[在模板”config/pages/default-page.FTL“中,在第4行,第54列]----]到达,根本原因FreeMarker模板错误:以下计算结果为null或丢失:==>springMacroRequestContext[在模板”

----提示:如果已知失败表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些仅覆盖表达式的最后一步;要覆盖整个表达式,

---FTL堆栈跟踪(“~”表示与嵌套相关):-在:${SpringMacroRequestContext.GetContex...[在模板“Spring.FTL”中,在宏“URL”中,第89行,第132列]失败

Java堆栈跟踪(针对程序员):----freemarker.core.invalidreferenceException:[...Exception消息已经打印出来;请参阅上面的...]在freemarker.core.invalidreferenceException.getInstance(InvalidReferenceException.Java:134)在freemarker.core.explectionTypeException.newDesciptionBuilder(ExplectionTypeException.Java:85)在

共有1个答案

殷建弼
2023-03-14

我想spring变量丢失是因为模板没有以<#import“/spring.ftl”作为spring>开始,也没有为此配置自动导入。最后是比较方便的方法。类似于Properties settings=newSettings.setProperty(“auto_import”,“/spring.ftl as spring”);setFreeMarkerSettings(设置);

(顺便说一句,将FreeMarker升级到最新的2.x.x...2.3.23已经过时了。)

 类似资料:
  • Exposing models over REST(将模型暴露给REST) 简介 REST 路径 使用 REST 路由 请求数据格式化 使用HTTP查询字符串传递JSON对象或数组 响应数据格式化 禁用 API Explorer 预定义的远程方法(remote methods) 暴露/隐藏 models, 方法, 端点(endpoints) 隐藏的方法和REST端点 案例: 只读端点(endpoi

  • 我正在使用与Freemarker启动的Spring Boot。 给定以下字符串: 我试图对这个字符串执行一些验证,以确保它包含正确的Freemarker语法。 ----提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-

  • 27.2 将Bean暴露给JMX MBeanExporter是Spring JMX 框架中的核心类。它负责把Spring bean注册到JMX MBeanServer。例如,下面的例子: package org.springframework.jmx; public class JmxTestBean implements IJmxTestBean { private Stri

  • 我有一个kubernetes文件,如下所示: 如果我想将其公开给外界流量,因为假设我的应用程序在端口上使用prometheus公开应用程序指标...如何向外界公开该端口? 我的应用程序有以下两行代码启动需要公开的http服务器: 那是普罗米修斯服务器

  • 我正在使用Smoks库进行XML到XML的转换。下面是Smoks配置。在freemarker模板中,我希望访问jdk库类以及我在项目中创建的类。请让我知道我如何实现这一点。

  • 但是在我的群集上没有服务/部署: 谢谢你的帮助