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] }
关键细节说明
- 集合统一处理:通过
instanceof Collection判断输入类型,把单个对象包装成列表,彻底避免误遍历Map的Entry。 - 安全导航操作符
?.:防止allAddresses或allPersons为null时抛出空指针异常。 - 原结构保留:处理完成后根据原输入类型返回对应结构,不改变原有数据格式。
测试示例
单个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
相关产品推荐
相关产品推荐

