Spring mvc 如何使用java向Freemaker配置公开spring标记库并处理Freemarker模板类?
我一直在尝试使用freemarker.template.template类来处理给定的.ftl模板。基本上,它找不到spring标记libs,遇到第一个标记时失败。但是,它读取spring宏指令的效果很好 在spring中附加我的freemarker配置和错误消息: 我正在使用Spring4和freemarker 2.3.23。在tomcat 7上运行Spring MVC应用程序时,它抱怨如下: ----FTL堆栈跟踪(“~”表示嵌套相关): -失败地址:@spring.url”/imports/app/vendor/boot…[在第5行第54列的模板“config/pages/default page.ftl”中] ----]根本原因FreeMarker模板错误:以下内容已计算为null或缺失: ==>spring[在第5行第56列的模板“config/pages/default page.ftl”中] Java堆栈跟踪(针对程序员): ----freemarker.core.InvalidReferenceException:[…已打印异常消息;请参见上面的…]位于 freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) 在 freemarker.core.UnexpectedTypeException.NewDescriptionBuilder(UnexpectedTypeException.java:77) 在 freemarker.core.UnexpectedTypeException.(UnexpectedTypeException.java:40) 位于freemarker.core.NonHashException.(NonHashException.java:46) 在freemarker.core.Dot.\u eval(Dot.java:45)处 freemarker.core.Expression.eval(Expression.java:78)位于 accept(UnifiedCall.java:74)位于 freemarker.core.Environment.visit(Environment.java:324)访问 accept(MixedContent.java:54)位于 freemarker.core.Environment.visit(Environment.java:324)访问 freemarker.core.Environment.process(Environment.java:302)位于 freemarker.template.template.process(template.java:325)位于 com.isys.ghp.server.services.web.impls.HtmlRenditionComposer.composeRendition(HtmlRenditionComposer.java:43) 在 com.isys.ghp.controllers.app.RootControllerApp.welcome(RootControllerApp.java:48) 在 com.isys.ghp.controllers.app.RootControllerApp$$FastClassBySpringCGLIB$$cebaa583.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157) 在 org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.procedue(MethodInvocationProceedingJoinPoint.java:85) 在 com.isys.ghp.server.aspects.MethodLogger.around(MethodLogger.java:21) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:606) org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) 在 org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) 在 org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:168) 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 在 com.isys.ghp.controllers.app.RootControllerApp$$EnhancerBySpringCGLIB$$55180b14.welcome() 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:606) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:620) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.javSpring mvc 如何使用java向Freemaker配置公开spring标记库并处理Freemarker模板类?,spring-mvc,freemarker,spring-java-config,Spring Mvc,Freemarker,Spring Java Config,我一直在尝试使用freemarker.template.template类来处理给定的.ftl模板。基本上,它找不到spring标记libs,遇到第一个标记时失败。但是,它读取spring宏指令的效果很好 在spring中附加我的freemarker配置和错误消息: 我正在使用Spring4和freemarker 2.3.23。在tomcat 7上运行Spring MVC应用程序时,它抱怨如下: ----FTL堆栈跟踪(“~”表示嵌套相关): -失败地址:@spring.url”/imports
@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;
}