"不兼容改进"设置
它要做什么
该设置指定了 FreeMarker 的版本号,那么就不会100%向后兼容bug修复和改进 你想要启用 已经实现的内容。 通常来说,默认把它留在2.3.0(最大向后兼容版本)是一个坏主意。
在新项目中,应该将它设置为实际使用的FreeMarker版本号。
而在老项目中,那么最好也将它设置的高一些,最好检查一下哪些修改是激活状态(可以在 Configuration(Version)
构造方法的API JavaDoc文档 中找到它们),至少不仅仅是
"不兼容改进" 第三版本号(小版本)设置提高。通常来讲,
只要为该设置增加最后的版本号,那么这些修改的风险就会小很多。
Bug修复和改进是完全向后兼容的,同样,它们也是重要的安全更新, 不管 "不兼容改进" 如何设置都是启用的。
该设置的一个重要结果是应用程序可以检查声明的 FreeMarker 最小版本需求是否达到。 比如你设置了2.3.22,但是应用程序却意外部署到了 FreeMarker 2.3.21, 那么FreeMarker就会出问题,告诉你需要一个更高的版本。 最后,请求的修复/改进不会作用于低版本。
如何设置
这个不兼容改进的设置在 Configuration
级别。
它可以在多种方式下设置(假设我们想将它设置为2.3.22):
-
创建
freemarker.template.Configuration
对象,比如:... = new Configuration(Configuration.VERSION_2_3_22)
-
或者,使用初始化设置来更改
Configuration
单例,比如:cfg.setIncompatibleImprovements(Configuration.VERSION_2_3_22)
-
或者,如果使用properties文件来配置FreeMarker (
*.properties
文件或者java.util.Properties
对象),添加:incompatible_improvements=2.3.22
-
或者,如果通过
FreemarkerServlet
来配置FreeMarker,那么将init-param
添加到web.xml
中:<init-param> <param-name>incompatible_improvements</param-name> <param-value>2.3.22</param-value> </init-param>
但是, 在应用程序中 如果设置了
object_wrapper
(也就是 Configuration.setObjectWrapper(ObjectWrapper)
),
那么要知道很重要的一点,BeansWrapper
和它的子类(最重要的是,
DefaultObjectWrapper
) 有它们自己独立的
incompatibleImprovements
属性,还有一些修复/改进会被它激活,
而不是通过 Configuration
的相似设置。
如果你没有在任何地方设置过 object_wrapper
,那么不需要知道这点,
因为,和 Configuration
一样,
默认的 object_wrapper
也有相同的 "不兼容改进"。
但是,如果设置了 object_wrapper
,
那么就不要忘了设置 ObjectWrapper
自己的
incompatibleImprovements
属性,此外还有
Configuration
。(请注意,对于 Configuration
来说,
有不同的 "不兼容改进" 也是可以的,而对于 ObjectWrapper
,
则有它自己的选择。) 至于 DefaultObjectWrapper
(对于 BeansWrapper
也是一样的,只是不同的类名而已) 参看这里如何来设置它。