如何自定义/替换 Freemarker 中的异常消息以使其更有意义?

How to customize / replace exception messages in Freemarker to make them more meaningful?

我想 "improve" 一些 Freemarker 模板消息抛出的异常消息,以使异常对用户更有意义。尽管 Freemarker 在有意义的错误消息方面已经变得更好,但在某些情况下,我想更具体一些。

例子 Freemarker 正在为这样的模板抛出此异常:

<#if (""?number > 1)>foo</#if>

(只是一个例子...假设空字符串也可以是一个包含空字符串的变量)

的值templateException.getMessage():

 (java.lang.String) Can't convert this string to number: ""
The blamed expression:
==> ""?number  [in nameless template at line 1, column 7]

----
FTL stack trace ("~" means nesting-related):
    - Failed at: #if (""?number > 1)  [in nameless template at line 1, column 1]
----

我想将这个具体案例改写为:

You tried to convert an EMPTY string variable to a number.

我可以尝试自己的异常处理程序,以包含检查、替换消息并重新抛出异常,如下所示:

configuration.setTemplateExceptionHandler(new TemplateExceptionHandler() {
            public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)
                    throws TemplateException {

                String message = te.getMessage();
                if(StringUtils.contains(message, "Can't convert this string to number: \"\"")){
                    message = StringUtils.replace(message, "Can't convert this string to number: \"\"", "You tried to convert an EMPTY string variable to a number. Solution: Try checking if the variable is empty to avoid this error.");
                }
                throw new TemplateException(message, env);                
            }
        });

但这感觉很hacky。

我的问题:

  1. 有没有办法自定义 Freemarker 抛出的异常消息?我在我的 TemplateExceptionHandler 中感觉为时已晚,因为消息在 Freemarker 中构建得更早。

  2. 改进/重写来自第 3 方库的异常消息的常用方法是什么?

搜索和替换在版本更新后可能无法使用,因为没有关于消息内容的向后兼容性承诺。

如果您想要的更改通常有用(不仅对您的项目),那么您可以通过为 FreeMarker 做出贡献来改进现有的错误消息(签署 Apache CLA,在 GitHub 上分叉,提出拉取请求) .

我看到的唯一真正正确和灵活的方法是向错误消息机制添加 l10n 支持,其中消息字符串没有硬连接到代码中(除了它们的默认值),而是基于消息检索来自外部源的密钥。当然,这可能是一项艰巨的工作,尤其是当 FreeMarker 消息由许多较小的片段组合而成时。