鉴于这个Groovy域类(用于MongoDB中的持久性):
@Canonical
class Counter {
@Id String id
String name
long count = 0
Date createdTimestamp = new Date()
Date updatedTimestamp = new Date()
}
因为只有' name'在创建一个新的Counter时需要提供,有没有办法调用@ Canonical生成的基于map的构造函数,因为下面的Groovy方法不能用Java编译:
// Invalid Java code
counterRepository.save(new Counter(name: newCounterName));
我必须使用隐式setter:
// Valid, but a bit verbose, Java code
Counter counter = new Counter();
counter.setName(newCounterName);
counterRepository.save(counter);
或者在Counter POGO中创建一个静态工厂方法:
static Counter init(String newCounterName) {
return new Counter(name: newCounterName)
}
启用以下内容:
// Valid, concise, but perhaps/hopefully redundant?
counterRepository.save(Counter.init(counterName));
最后一种方法是目前使用的方法。
答案 0 :(得分:1)
如果我理解正确,你真的不想使用@Cannonical
,那么你就更@TupleConstructor
了。使用此AST,您可以指定要使用的字段,并在构造函数上使用更细粒度的控制器。一个例子可能是:
@TupleConstructor(includes=['name'])
class Counter {
@Id String id
String name
long count = 0
Date createdTimestamp = new Date()
Date updatedTimestamp = new Date()
}
有关详情,请参阅http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/TupleConstructor.html