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

在Java代码中调用@Canonical Groovy POGO构造函数,java,groovy,Java,Groovy,给定此Groovy域类(用于MongoDB中的持久性): 由于创建新计数器时只需提供“name”,因此有没有方法调用@Canonical生成的基于映射的构造函数,因为下面的Groovy方法不会在Java中编译: // Invalid Java code counterRepository.save(new Counter(name: newCounterName)); 我必须使用隐式setter: // Valid, but a bit verbose, Java code Counter c

给定此Groovy域类(用于MongoDB中的持久性):

由于创建新计数器时只需提供“name”,因此有没有方法调用@Canonical生成的基于映射的构造函数,因为下面的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);
或在计数器POGO中创建静态工厂方法:

static Counter init(String newCounterName) {
    return new Counter(name: newCounterName)
}
启用以下功能:

// Valid, concise, but perhaps/hopefully redundant?
counterRepository.save(Counter.init(counterName));

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

如果我正确理解您的意思,您并不真的想使用
@Cannonical
,您更喜欢
@TupleConstructor
。使用此AST,您可以指定要使用的字段,并在构造函数上具有更细粒度的控制器。例如:

@TupleConstructor(includes=['name'])
class Counter {
  @Id String id
  String name
  long count = 0
  Date createdTimestamp = new Date()
  Date updatedTimestamp = new Date()
}

有关更多信息,请参见

您是否在java中创建此groovy域类的实例?是的,我在基于java的Spring MVC@RestControllerFrom文档中创建groovy类的实例:提供了元组样式的构造函数,允许您按照定义的相同顺序设置属性。因此,如果更改
id
name
的顺序,就有机会让它工作。
@Canonical
注释还应用了元组构造函数(以及equals和hashcode)。我认为这并不能回答问题-至少对我来说不是:我目前没有解决方案。正如@cjsethno所提到的,
@Canonical
意味着
@TupleConstructor
,并且如图所示添加显式属性似乎没有帮助。问题似乎在于Groovy
@TupleConstructor
转换的应用方式并不是Java源代码可以从同一个jar中使用它。另见这个问题:
@TupleConstructor(includes=['name'])
class Counter {
  @Id String id
  String name
  long count = 0
  Date createdTimestamp = new Date()
  Date updatedTimestamp = new Date()
}