我想"改善" 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);
}
});
但这感觉非常黑客。
我的问题:
有没有办法如何自定义Freemarker抛出的异常消息?我感觉在我的TemplateExceptionHandler中已经太晚了,因为消息在Freemarker内部得到了更早的构建。
从第三方库中改进/重写异常消息的常用方法是什么?
答案 0 :(得分:1)
在版本更新后,搜索和替换可能无效,因为没有关于邮件内容的向后兼容性承诺。
如果您想要的更改通常很有用(不仅适用于您的项目),那么您可以通过向FreeMarker提供帮助来改进现有的错误消息(签署Apache CLA,在GitHub上分叉,生成拉取请求)。
我看到的唯一真正正确和灵活的方法是向错误消息机制添加l10n支持,其中消息字符串没有硬连线到代码(默认值除外),但是基于来自的消息键检索外部源。当然,这可能是一项重大工作,特别是FreeMarker消息是由许多小块组成的。