Velocity中if条件不生效且foreach循环重复执行的问题排查
Velocity 循环重复执行&属性校验问题解决方案
问题根因
你遇到的foreach循环执行两次的问题,核心原因是你遍历的CartaPorte.Ubicaciones.Ubicacion数组本身包含2个元素,分别对应始发地节点、目的地节点,循环默认遍历所有元素自然会执行两次。
同时你提到的if条件判断异常,大概率是属性层级取错导致:你提供的JSON结构里,CartaPorte根节点和Ubicacion数组内的始发地节点都存在NombreRemitente属性,两个位置的属性值不同,没有明确指定层级就会出现判断不符合预期的情况。
解决方案
场景1:仅需提取一次收发件人信息生成表格
不需要遍历数组,直接通过下标定位对应节点取值即可,示例代码如下:
## 取发件人信息(数组第一个元素对应始发地) #set($remitente = $CartaPorte.Ubicaciones.Ubicacion[0].Origen) 发件人姓名:$remitente.NombreRemitente 发件人RFC:$remitente.RFCRemitente ## 取收件人信息(数组第二个元素对应目的地) #set($destinatario = $CartaPorte.Ubicaciones.Ubicacion[1].Destino) 收件人姓名:$destinatario.NombreDestinatario 收件人RFC:$destinatario.RFCDestinatario
场景2:需要遍历数组做全量属性校验
在循环内增加节点存在性判断,避免无效逻辑执行,同时补充属性非空校验,示例代码如下:
#foreach($ubicacion in $CartaPorte.Ubicaciones.Ubicacion) ## 校验始发地节点属性 #if($ubicacion.Origen) #if($ubicacion.Origen.NombreRemitente && $ubicacion.Origen.NombreRemitente.trim() != "") 发件人姓名校验通过:$ubicacion.Origen.NombreRemitente #else 发件人姓名为空,校验不通过 #end #if($ubicacion.Origen.RFCRemitente && $ubicacion.Origen.RFCRemitente.trim() != "") 发件人RFC校验通过:$ubicacion.Origen.RFCRemitente #else 发件人RFC为空,校验不通过 #end #end ## 校验目的地节点属性 #if($ubicacion.Destino) #if($ubicacion.Destino.NombreDestinatario && $ubicacion.Destino.NombreDestinatario.trim() != "") 收件人姓名校验通过:$ubicacion.Destino.NombreDestinatario #else 收件人姓名为空,校验不通过 #end #if($ubicacion.Destino.RFCDestinatario && $ubicacion.Destino.RFCDestinatario.trim() != "") 收件人RFC校验通过:$ubicacion.Destino.RFCDestinatario #else 收件人RFC为空,校验不通过 #end #end #end
注意事项
如果你的校验规则需要用到CartaPorte根节点下的NombreRemitente、RFCRemitente属性,直接取值$CartaPorte.NombreRemitente即可,不要和数组内的同名属性混淆。
内容的提问来源于stack exchange,提问作者HectorAnt0
相关产品推荐
相关产品推荐

