You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy代码报错:CustomerMaster为非数组时无法移除子数组customerNumber

解决Groovy处理单个CustomerMaster对象时的属性缺失报错问题

问题分析

报错groovy.lang.MissingPropertyException: No such property: allAddresses for class: java.util.LinkedHashMap$Entry的核心原因:当CustomerMaster是单个LinkedHashMap对象时,若直接对其调用each方法,Groovy会遍历Map的键值对,每个迭代元素是Map.Entry而非CustomerMaster对象,自然找不到allAddresses属性;而当CustomerMaster是数组/集合时,each遍历的是集合内的CustomerMaster对象,所以逻辑正常。

解决方案

先统一将输入转换为集合(兼容单个对象和数组/列表场景),再遍历处理每个CustomerMaster对象,移除子数组内的customerNumber字段:

def cleanCustomerData(def input) {
    // 统一转为集合,确保遍历逻辑一致
    def customerCollection = input instanceof Collection ? input : [input]
    
    customerCollection.each { customer ->
        // 移除allAddresses中每个元素的customerNumber
        customer.allAddresses?.each { addr ->
            addr.remove('customerNumber')
        }
        // 移除allPersons中每个元素的customerNumber
        customer.allPersons?.each { person ->
            person.remove('customerNumber')
        }
    }
    
    // 保持原数据结构返回,避免格式变更
    return input instanceof Collection ? customerCollection : customerCollection[0]
}

关键细节说明

  1. 集合统一处理:通过instanceof Collection判断输入类型,把单个对象包装成列表,彻底避免误遍历Map的Entry。
  2. 安全导航操作符?.:防止allAddresses或allPersons为null时抛出空指针异常。
  3. 原结构保留:处理完成后根据原输入类型返回对应结构,不改变原有数据格式。

测试示例

单个CustomerMaster对象Payload

{
    "customerNumber": "CUST001",
    "allAddresses": [
        {
            "customerNumber": "CUST001",
            "street": "123 Main St"
        }
    ],
    "allPersons": [
        {
            "customerNumber": "CUST001",
            "name": "John Doe"
        }
    ]
}

多个CustomerMaster对象数组Payload

[
    {
        "customerNumber": "CUST001",
        "allAddresses": [
            {
                "customerNumber": "CUST001",
                "street": "123 Main St"
            }
        ]
    },
    {
        "customerNumber": "CUST002",
        "allPersons": [
            {
                "customerNumber": "CUST002",
                "name": "Jane Smith"
            }
        ]
    }
]

处理后效果

两种场景下,父级customerNumber保留,allAddresses和allPersons数组内的customerNumber均被移除。

为何hasProperty/respondsTo无效?

你之前尝试的hasProperty()或respondsTo()之所以没用,是因为当遍历Map的Entry时,你是在判断Entry对象是否有allAddresses属性,而非CustomerMaster对象。只有先确保迭代元素是CustomerMaster对象,这些判断才有意义。

内容的提问来源于stack exchange,提问作者Kumar Badam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:05:27