在Java代码中调用@Canonical Groovy POGO构造函数
给定此Groovy域类(用于MongoDB中的持久性): 由于创建新计数器时只需提供“name”,因此有没有方法调用@Canonical生成的基于映射的构造函数,因为下面的Groovy方法不会在Java中编译:在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
// 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()
}