freemarker.core.InvalidReferenceException异常

本文主要介绍了在使用Freemarker模板引擎时遇到的`InvalidReferenceException`异常,该异常通常由于尝试访问未定义的对象属性引起。通过在访问属性前检查对象是否为空,可以避免此类错误。解决方案是在代码中增加对象判空操作,确保在执行属性获取之前对象已初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Expression page.url is undefined on line 6, column 7 in web/pages/ftl/common/page.ftl.
The problematic instruction:
----------
==> if (page.url.indexOf("?") > 0) [on line 6, column 1 in web/pages/ftl/common/page.ftl]
 in include "../common/page.ftl" [on line 34, column 25 in web/pages/ftl/news/news.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression page.url is undefined on line 6, column 7 in web/pages/ftl/common/page.ftl.
    at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)
    at freemarker.core.Dot._getAsTemplateModel(Dot.java:78)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:86)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.ComparisonExpression.isTrue(ComparisonExpression.java:111)
    at freemarker.core.ParentheticalExpression.isTrue(ParentheticalExpression.java:66)
    at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:77)
    at freemarker.core.Environment.visit(Environment.java:196)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:196)
    at freemarker.core.Environment.include(Environment.java:1375)
    at freemarker.core.Include.accept(Include.java:155)
    at freemarker.core.Environment.visit(Environment.java:196)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:196)
    at freemarker.core.Environment.process(Environment.java:176)
    at freemarker.template.Template.process(Template.java:231)
    at com.opensymphony.webwork.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:214)
    at com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:143)
    at com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:313)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:208)
    at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:175)
    at com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:115)
    at com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.webwork.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:174)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.webwork.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:169)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:151)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:186)
    at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
    at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
    at com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:273)
    at com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Unknown Source)

一般出现这种异常的原因为:如果对象为空,则freemarker就会抛出这个异常。

其实解决很简单,在用对象之前先判空,不空在进行属性的获取操作即可。

### 解决 `freemarker.core` 不存在的问题 当遇到添加了 FreeMarker 的 jar 文件之后仍然报告 `freemarker.core` 类找不到的情况时,这通常意味着依赖项未被正确加载或存在版本冲突。 #### 验证 Maven 或 Gradle 中的依赖配置 确保项目的构建工具(Maven/Gradle)中的 pom.xml 或 build.gradle 正确包含了 FreeMarker 依赖,并且指定了具体的版本号。对于 Maven 来说,应该像这样定义: ```xml <dependencies> <!-- freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> </dependencies> ``` 上述 XML 片段展示了如何在 Maven 项目中声明对 FreeMarker 库的具体版本的需求[^2]。 #### 清理并重新导入依赖库 有时 IDE 可能未能及时更新本地仓库的变化,因此建议执行清理操作后再尝试编译项目。对于大多数现代开发环境而言,在菜单栏选择相应的选项即可完成此过程,比如 IntelliJ IDEA 提供了一个名为 "Invalidate Caches / Restart..." 的功能来刷新缓存和索引。 #### 检查类路径设置 确认应用程序启动时所使用的类路径确实包含有 FreeMarker JAR 文件的位置。如果是在命令行下运行 Java 程序,则可以通过 `-cp` 参数指定完整的类路径;而在集成开发环境中则需检查项目属性里的 Libraries 设置部分是否有误。 #### 排除潜在的版本冲突 如果有多个不同版本的 FreeMarker 被引入到了同一个应用里,可能会引发此类错误。可以利用一些工具如 Dependency Management 插件帮助识别并解决这些冲突问题。 #### 使用最新稳定版 考虑到旧版本可能存在 bug 导致无法正常工作,推荐升级至最新的稳定发行版以获得更好的兼容性和性能表现。当前较新的版本为 2.3.x 系列[^3]。 ```python import freemarker.template.Configuration; Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); // 初始化其他参数... ``` 以上 Python 示例仅用于展示如何创建一个 FreeMarker Template 对象实例,并不是实际解决方案的一部分。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值