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?