我正在尝试创建一个类并使用默认值初始化所有值。所以我在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
答案 0 :(得分:3)
您收到错误,因为您试图覆盖class
的{{1}}属性,该*HashMap
以getClass()
提供,当然不可写。
您应该注意,您要复制的属性。 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"] }