FreeMarker 长度截取 模板语言指令

easydb项目freemarker 邮件模板长度截取,sqlText 长度超过500显示链接到系统全表扫描监控界面,期间报错:

FreeMarker template error:
The following has evaluated to null or missing:
==> val.sqlText  [in template "sqlScanTableTemplate.ftl" at line 98, column 100]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${val.sqlText[0..500]}  [in template "sqlScanTableTemplate.ftl" at line 98, column 98]
----
Java stack trace (for programmers):
----
freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
FreeMarker template error:
Range start index 0 is out of bounds, because the sliced string has only 0 character(s). (Note that indices are 0-based).
The blamed expression:
==> 0..500  [in template "sqlScanTableTemplate.ftl" at line 98, column 115]
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${val.sqlText!""[0..500]?default("")}  [in template "sqlScanTableTemplate.ftl" at line 98, column 98]
----
Java stack trace (for programmers):
----
freemarker.core._MiscTemplateException: [... Exception message was already printed; see it above ...]
2018-06-07 10:40:00.059 [ClusterScheduler_Worker-8] INFO  com.bank.pingan.CronJob.SendMailJob - key= 10.14.207.24 and value= [com.bank.pingan.orm.base.system.VdbSqlScanCurContact@1102c0c8]
freemarker.core.ParseException: Syntax error in template "sqlScanTableTemplate.ftl" in line 98, column 112:
Unknown built-in: "val". Help (latest version): https://freemarker.apache.org/docs/ref_builtins.html; you're using FreeMarker 2.3.28.
The alphabetical list of built-ins:
abs, absolute_template_name, ancestors, api, 
boolean, byte, 
c, cap_first, capitalize, ceiling, children, chop_linebreak, chunk, contains, counter, 
date, date_if_unknown, datetime, datetime_if_unknown, default, double, 
ends_with, ensure_ends_with, ensure_starts_with, esc, eval, exists, 
first, float, floor, 
groups, 
has_api, has_content, has_next, html, 
if_exists, index, index_of, int, interpret, is_boolean, is_collection, is_collection_ex, is_date, is_date_like, is_date_only, is_datetime, is_directive, is_enumerable, is_even_item, is_first, is_hash, is_hash_ex, is_indexable, is_infinite, is_last, is_macro, is_markup_output, is_method, is_nan, is_node, is_number, is_odd_item, is_sequence, is_string, is_time, is_transform, is_unknown_date_like, iso, iso_h, iso_h_nz, iso_local, iso_local_h, iso_local_h_nz, iso_local_m, iso_local_m_nz, iso_local_ms, iso_local_ms_nz, iso_local_nz, iso_m, iso_m_nz, iso_ms, iso_ms_nz, iso_nz, iso_utc, iso_utc_fz, iso_utc_h, iso_utc_h_nz, iso_utc_m, iso_utc_m_nz, iso_utc_ms, iso_utc_ms_nz, iso_utc_nz, item_cycle, item_parity, item_parity_cap, 
j_string, join, js_string, json_string, 
keep_after, keep_after_last, keep_before, keep_before_last, keys, 
last, last_index_of, left_pad, length, long, lower_abc, lower_case, 
markup_string, matches, max, min, 
namespace, new, next_sibling, no_esc, node_name, node_namespace, node_type, number, number_to_date, number_to_datetime, number_to_time, 
parent, previous_sibling, 
remove_beginning, remove_ending, replace, reverse, right_pad, root, round, rtf, 
seq_contains, seq_index_of, seq_last_index_of, sequence, short, size, sort, sort_by, split, starts_with, string, substring, switch, 
then, time, time_if_unknown, trim, 
uncap_first, upper_abc, upper_case, url, url_path, 
values, 
web_safe, word_list, 
xhtml, xml
at freemarker.core.BuiltIn.newBuiltIn(BuiltIn.java:367)
at freemarker.core.FMParser.BuiltIn(FMParser.java:1196)
at freemarker.core.FMParser.PrimaryExpression(FMParser.java:594)
at freemarker.core.FMParser.UnaryExpression(FMParser.java:706)
at freemarker.core.FMParser.MultiplicativeExpression(FMParser.java:821)
at freemarker.core.FMParser.AdditiveExpression(FMParser.java:773)
at freemarker.core.FMParser.RangeExpression(FMParser.java:953)
at freemarker.core.FMParser.RelationalExpression(FMParser.java:901)
at freemarker.core.FMParser.EqualityExpression(FMParser.java:864)
at freemarker.core.FMParser.AndExpression(FMParser.java:1020)
at freemarker.core.FMParser.OrExpression(FMParser.java:1042)
at freemarker.core.FMParser.Expression(FMParser.java:551)
at freemarker.core.FMParser.StringOutput(FMParser.java:1545)
at freemarker.core.FMParser.MixedContentElements(FMParser.java:3761)
at freemarker.core.FMParser.If(FMParser.java:1689)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:3422)
at freemarker.core.FMParser.MixedContentElements(FMParser.java:3812)
at freemarker.core.FMParser.List(FMParser.java:1784)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:3426)
at freemarker.core.FMParser.MixedContentElements(FMParser.java:3812)
at freemarker.core.FMParser.If(FMParser.java:1663)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:3422)
at freemarker.core.FMParser.MixedContentElements(FMParser.java:3812)
at freemarker.core.FMParser.Root(FMParser.java:4458)
at freemarker.template.Template.<init>(Template.java:253)
at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:549)
at freemarker.cache.TemplateCache.getTemplateInternal(TemplateCache.java:439)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:292)
at freemarker.template.Configuration.getTemplate(Configuration.java:2750)
at freemarker.template.Configuration.getTemplate(Configuration.java:2599)
at com.bank.pingan.util.FreeMarkerUtil.getTemplate(FreeMarkerUtil.java:131)
at com.bank.pingan.util.FreeMarkerUtil.printString(FreeMarkerUtil.java:153)
at com.bank.pingan.CronJob.SendMailJob.execute(SendMailJob.java:110)
at sun.reflect.GeneratedMethodAccessor150.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.bank.pingan.task.util.TaskUtils.invokMethod(TaskUtils.java:54)
at com.bank.pingan.task.job.DisableConcurrentExecution.execute(DisableConcurrentExecution.java:23)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

正确写法:注意:如果正向判断  存在并且小于500  其他情况直接显示  此时可能会有越界报错。所以换个思路反向判断,小问题更应该注意下。

<#if (val.sqlText??&&val.sqlText?length gt 500)>   
            <td class="mytd"><a href="http://ip/easydb?ip=${val.ip!''}&dbType=${val.type!''}&dbInstanceName=${val.dbinstancename!''}&sqlId=${val.sqlId!''}">${val.sqlId!''}</a></td>
            <td class="mytd" style="word-break: break-all;width:100px;nowrap:nowrap">${(val.sqlText!'')[0..500]}...</td>
<#else> 
            <td class="mytd">${val.sqlId!''}</td>
            <td class="mytd" style="word-break: break-all;width:100px;nowrap:nowrap">${val.sqlText!''}</td>
</#if>

心得:如果正向判断不行,就反向判断,换个思路更开阔。任何事情如果想提炼积极的心得都是能提取的。

          作为程序员,不单单要注重细节,更要提高一个层次,思考下做的功能意义,给谁用?解决什么问题?提高一个思考方向提升到设计兼开发全能。不要觉得自己是世界第一,高手在民间,任何一个人都有比你强的闪光点存在的。

参考官方文档:http://freemarker.foofun.cn/dgui_template_exp.html#dgui_template_exp_stringop_slice 

©声明:本站原创文章采用 BY-NC-SA 共享协议,受法律保护,转载请注明出处;转载文章版权归原作者所有。
©转载请注明来源:

未经允许不得转载:最优质网--最有指望 » FreeMarker 长度截取 模板语言指令

赞 (0) 打赏

评论 0

评论前必须登录!

登陆 注册

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏