速度模板从数组中删除元素

velocity template drop element from array

我正在尝试删除速度模板中数组的最后一个元素,然后将其连接成一个字符串并在下面的 "className": 键中显示结果:

    #set($elem = '"System.NotImplementedException: Test Exception')
    #set($trace = $elem.replace('"',""))
    #set($tracearray = $trace.split("\."))
    #set($arraysize = $tracearray.size())
    #set($lastelem = $tracearray.size() - 1)
    {
      "className":$tracearray.remove($lastelem).toString(),
      "method":"$tracearray[$lastelem]"
    }#if($foreach.hasNext),#end
    #end
  ]

我尝试了几种不同的方法来让数组删除元素并将其连接成一个字符串,但到目前为止还没有成功。

从上面的示例中,我正在寻找要实现的以下输出。

{
  "className":"System",
  "method":"NotImplementedException: Test Exception"
}

$elem 变量将保存各种长度的字符串,并且其中包含不同数量的 . 以进行拆分,因此数组的长度会有所不同。

如果只需要删除最后一个元素,为什么还要拆分整个字符串呢?你可以做一些解析来提取 class 名称:

#set($elem = '"System.NotImplementedException: Test Exception')                                                                                                                                                 
#set($trace = $elem.replace('"',""))
#set($dot = $trace.lastIndexOf('.'))
#set($className = $trace.substring(0, $dot))
#set($method = $trace.substring($dot + 1))
{
  "className": "$className",
  "method": "$method"
}

或者,为了适应消息末尾 可以 包含一个点的事实:

#set($elem = '"System.NotImplementedException: Test Exception')                                                                                                                                                 
#set($trace = $elem.replace('"',""))
#set($colon = $trace.indexOf(':'))
#set($dot = $trace.lastIndexOf('.', $colon))
#set($className = $trace.substring(0, $dot))
#set($method = $trace.substring($dot + 1))
{
  "className": "$className",
  "method": "$method"
}

使用您选择的方法,您将需要另一个工具来用“.”连接回数组元素。综上所述,如果您碰巧能够使用自定义工具填充 Velocity 上下文,那么使用此自定义工具可以更轻松地完成所有这些工作。