Velocity 解析器在解析 java 代码模板时崩溃
Velocity parser crashes when parsing java code template
当尝试使用 java 源代码作为 Velocity 的模板时,它在模板的这一行崩溃:
/* @see panama.form.Validator#validate(java.lang.Object) */
有这个例外:
Exception in thread "main" org.apache.velocity.exception.ParseErrorException: Lexical error, Encountered: "l" (108), after : "." at *unset*[line 23, column 53]
at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1301)
at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1265)
at org.apache.velocity.app.VelocityEngine.evaluate(VelocityEngine.java:199)
显然,它使用 #validate
作为宏,并在尝试解析宏的参数时崩溃。对此有什么办法吗?
我正在使用 Velocity 1.7。
编辑
我知道我可以转义模板文件中的 #
字符,但是其中有相当多的字符可能会不时更改,所以我更喜欢一种不需要手动更改的方式在文件上。
第一个选项
从这里尝试这个解决方案:Escaping VTL Directives
VTL 指令可以使用反斜杠字符 ("\") 进行转义,其方式类似于有效的 VTL 引用。
## #include( "a.txt" ) renders as <contents of a.txt>
#include( "a.txt" )
## \#include( "a.txt" ) renders as #include( "a.txt" )
\#include( "a.txt" )
## \#include ( "a.txt" ) renders as \<contents of a.txt>
\#include ( "a.txt" )
第二个选项
你有这个工具 [EscapeTool][2]
。
在 Velocity 模板中处理转义的工具。
它为 Java、JavaScript、HTML、XML 和 [=47] 提供了 转义输出的方法=]. 还提供了渲染需要转义的 VTL 字符的方法。
第三个选项:
您也可以尝试这个解决方法,我没有使用它,但它应该可以工作:
您可以在开始时将您的模板作为 String
阅读,然后 预解析 它。例如将所有 #
替换为 \#
,或添加到文件开头
#set( $H = '#' )
$H$H
看到这个答案:How to escape a # in velocity And then from that pre-parsed String
create Template by using this answer: How to use String as Velocity Template?
当尝试使用 java 源代码作为 Velocity 的模板时,它在模板的这一行崩溃:
/* @see panama.form.Validator#validate(java.lang.Object) */
有这个例外:
Exception in thread "main" org.apache.velocity.exception.ParseErrorException: Lexical error, Encountered: "l" (108), after : "." at *unset*[line 23, column 53]
at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1301)
at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1265)
at org.apache.velocity.app.VelocityEngine.evaluate(VelocityEngine.java:199)
显然,它使用 #validate
作为宏,并在尝试解析宏的参数时崩溃。对此有什么办法吗?
我正在使用 Velocity 1.7。
编辑
我知道我可以转义模板文件中的 #
字符,但是其中有相当多的字符可能会不时更改,所以我更喜欢一种不需要手动更改的方式在文件上。
第一个选项 从这里尝试这个解决方案:Escaping VTL Directives
VTL 指令可以使用反斜杠字符 ("\") 进行转义,其方式类似于有效的 VTL 引用。
## #include( "a.txt" ) renders as <contents of a.txt>
#include( "a.txt" )
## \#include( "a.txt" ) renders as #include( "a.txt" )
\#include( "a.txt" )
## \#include ( "a.txt" ) renders as \<contents of a.txt>
\#include ( "a.txt" )
第二个选项
你有这个工具 [EscapeTool][2]
。
在 Velocity 模板中处理转义的工具。
它为 Java、JavaScript、HTML、XML 和 [=47] 提供了 转义输出的方法=]. 还提供了渲染需要转义的 VTL 字符的方法。
第三个选项: 您也可以尝试这个解决方法,我没有使用它,但它应该可以工作:
您可以在开始时将您的模板作为 String
阅读,然后 预解析 它。例如将所有 #
替换为 \#
,或添加到文件开头
#set( $H = '#' )
$H$H
看到这个答案:How to escape a # in velocity And then from that pre-parsed String
create Template by using this answer: How to use String as Velocity Template?