“不兼容的改进”设置

Page Contents

它做什么

此设置指定 FreeMarker 版本号,其中已经实现了您要启用的非 100%向后兼容的错误修复和改进。通常,将其保留为默认值 2.3.0(最大向后兼容性)是一个坏主意。

在新项目中,应将其设置为启动项目时实际使用的固定 FreeMarker 版本(例如Configuration.VERSION_2_3_28)。在较旧的项目中,通常最好保持较高的值,但是您应该检查激活的更改(在Configuration(Version)构造函数的 API JavaDoc中找到它们),尤其是如果不仅增加了“不兼容的改进”设置的第 3 个版本号(微型版本)。通常,只要您仅增加此设置的最后一个(第 3 个)版本号,更改的风险就很小,是否可以承受该风险取决于具体的应用程序。不过,切勿使用Configuration.getVersion()之类的动态值,因为那样升级 FreeMarker 可能会破坏您的应用程序!

无论“不兼容的改进”设置如何,都可以启用完全向后兼容的错误修复和改进,以及那些重要的安全修复程序。

设置此设置的重要结果是,现在您的应用程序将检查是否满足规定的最低 FreeMarker 版本要求。就像您将此设置设置为 2.3.22 一样,但是偶然地使用 FreeMarker 2.3.21 部署了该应用程序,那么 FreeMarker 将失败,并告知需要更高版本。毕竟,您要求的修复/改进在较低版本上不可用。

如何设定

Configuration级别上存在不兼容的改进设置。可以通过多种方式进行设置:

  • 创建freemarker.template.Configuration对象,如下所示:
... = new Configuration(Configuration.VERSION_2_3_28)
  • 或者,更改Configuration单例以初始化其其他设置,例如:
cfg.setIncompatibleImprovements(Configuration.VERSION_2_3_28)
  • 或者,如果要使用属性(*.properties文件或java.util.Properties对象)配置 FreeMarker,请添加:
incompatible_improvements=2.3.28
  • 或者,如果您通过FreemarkerServlet配置 FreeMarker,请将init-param添加到web.xml中:
<init-param>
    <param-name>incompatible_improvements</param-name>
    <param-value>2.3.28</param-value>
</init-param>

但是,如果您设置配置的object_wrapper设置(与Configuration.setObjectWrapper(ObjectWrapper)相同),那么重要的是要知道BeansWrapper及其子类(最重要的是DefaultObjectWrapper)具有自己独立的incompatibleImprovements属性,并且某些修正/改进被激活而不是Configuration的类似设置。如果您未在任何地方设置object_wrapper配置设置,则不必知道这种复杂性,因为默认object_wrapper具有与Configuration相同的“不兼容改进”。但是,如果要设置object_wrapper,那么除了Configuration的属性外,您一定不要忘记设置ObjectWrapper本身的incompatibleImprovements属性。 (请注意,对ConfigurationObjectWrapper进行不同的“不兼容的改进”是很好的,只是应该是一个有意识的决定.)看到这里如何设置DefaultObjectWrapper的情况下(对于BeansWrapper相同,只是具有不同的类名) 。

Warning!

永远不要使用Configuration.getVersion()来设置“不兼容的改进”设置。始终使用固定值,例如Configuration.VERSION_2_3_28。否则,您的应用程序可能会在升级 FreeMarker 时中断。 “不兼容的改进”的全部要点是保护您免受此侵害,同时您仍然始终可以获得向后兼容的修补程序/改进。