【问题标题】:How to fail Velocity template processing with tracable message如何使用可跟踪消息使 Velocity 模板处理失败
【发布时间】:2018-03-17 04:32:43
【问题描述】:

拥有:

  • Velocity 模板或宏
  • 一些对象

如何验证对象 (#if) 和失败(停止进一步处理)以一种易于追踪到失败位置的方式(如在 Java 中抛出异常)。

我正在寻找这样的东西:

#if ( ! $context.treasureMap.containsKey('gold'))
  #fail('no golden treasure here')
#end

背景

我正在编写一个 Maven 网站页面。速度上下文由 maven 注入并包含 POM 信息。我想从有效的 pom 中测试一些信息的存在。当信息不可用时,我想失败。

要求

  • 速度处理失败 > 站点生成失败 > Maven 构建失败。
  • 错误信息应导致故障位置,因此应修复该站点
  • 最好没有配置(没有扩展,只是简单的 Velocity 中包含的构造/工具)

试过

  • 严格参考模式
    不需要的配置,不想每次都失败。
  • #evaluate('#end') 又名语法错误
    (选择#end 对我的意图最具描述性)基本上是我想要的。处理和 maven 构建失败,但错误消息不会导致返回失败位置: ParseException: Encountered "#end" at line 1, column 1.

【问题讨论】:

  • 为了至少在 Maven 构建中显示错误行/列,我发现来自 Velocity 异常的信息未在 doxia-site-renderer 工件中使用。我报告了一个问题DOXIASITETOOLS-179

标签: velocity maven-site-plugin


【解决方案1】:

您需要进行产生异常的方法调用。参见explanation

在 Velocity 中唯一可能遇到问题的地方是调用了在运行时引发异常的方法。例如,这个 VTL 定义了一个字符串 $foo,然后尝试调用它的 substring() 方法会抛出一个 IndexOutOfBoundsException:

 #set ($foo = "bar")

  #set ($bar = $foo.substring(0,10))

当抛出异常时,解析器将停止处理并将该异常向上抛出堆栈树,在那里它可以在导致解析器执行的方法中被捕获。到那时,可以优雅地处理异常。

【讨论】:

  • 是的,我正在寻找类似的东西,但错误消息没有帮助“获取 testpage.vm 的解析器时出错”
  • 但是您的线路失败和描述。对于用户定义的异常,请参阅stackoverflow.com/questions/15659200/…
  • 我在任何地方都看不到行或列 - 生成的页面是空白的,maven 只显示我引用的信息。
  • 我不使用 Java 的速度,因此无法修改 Java 的上下文(注册处理程序等)。速度由 maven (maven-site-plugin) 处理,我的入口点是 Velocity 模板。
  • 也没有生成velocity.log(我猜是maven消耗的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多