无法设置readonly属性:使用map初始化时groovy中的类的类

时间:2016-07-12 12:37:54

标签: groovy

我正在尝试创建一个类并使用默认值初始化所有值。所以我在groovy中有这个pojo,并且我已经创建了initializeWithDefaults方法来初始化所有值。我试图在构造函数中传递map

class MDS {
    String id
    String mdsName
    String name
    String mdsType
    String mdsContext
    String mdsDateTime
    String mdsDomain

    public static void initializeWithDefaults() {
        MDS dataSegmentIdDef = new MDS()
        Map<String, Object> prop = dataSegmentIdDef.properties
        prop.each { Map.Entry entry->
            entry.value = "default-${entry.key}"
        }

        MDS dataSegmentId = new MDS(prop)

    }
}

但我一直收到错误

in thread "main" groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: class for class: com.ambuj.domain.MDS 

2 个答案:

答案 0 :(得分:3)

您收到错误,因为您试图覆盖class的{​​{1}}属性,该*HashMapgetClass()提供,当然不可写。

您应该注意,您要复制的属性。 Groovy控制台中的一个简单实验看起来像(注意!prop.synthetic):

class MDS {
  // your props

  @Override
  String toString() {
    "$id:$mdsName:$mdsDomain"
  }

  static void initializeWithDefaults() {
    MDS mds = MDS.class.declaredFields.inject( new MDS() ){ MDS mds, prop ->
      if( !prop.synthetic ) mds[ prop.name ] = "default.$prop.name"
      mds
    }
    println mds
  }
}

MDS.initializeWithDefaults()

和输出:

Result: default.id:default.mdsName:default.mdsDomain

答案 1 :(得分:0)

一个快速解决方法是使用findAll方法过滤掉已有值的属性。

public static void initializeWithDefaults() {
    MDS dataSegmentIdDef = new MDS()
    Map<String, Object> prop = dataSegmentIdDef.properties.findAll { !it.value }
    prop.each { Map.Entry entry->
        entry.value = "default-${entry.key}"
    }

    MDS dataSegmentId = new MDS(prop)
}

我还建议将each替换为collectEntries

    Map<String, Object> prop = dataSegmentIdDef.properties
            .findAll { !it.value }
            .collectEntries { key, noValue -> [key, "default-$key"] }