在Java代码中调用@Canonical Groovy POGO构造函数

时间:2015-05-30 10:18:35

标签: java groovy

鉴于这个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));

最后一种方法是目前使用的方法。

1 个答案:

答案 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