我想在Grails控制器中使用Groovy特性,如下所示:
trait ColumnSelectionController {
def selectColumns() {
//Do something here
}
}
class MyController implements ColumnSelectionController {
def index() {
//Calculate list model
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我在Grails中运行它时,"selectColumns"操作不可见,我从Grails得到404响应.我怀疑我需要对特征做一些事情,以便在其中定义的方法被识别为实现类中的动作.谁知道那可能是什么?
编辑1:
更多信息:特征在src/groovy中定义,而不是在grails-app/controllers中定义,因此它没有被定义为Artefact.
编辑2:
此外,如果我将特征更改为类,使用@Artefact注释标记它并更改MyController以扩展此类,一切都按预期工作.试图在特征上使用@Artefact注释没有任何意义(没什么大惊喜).
我有一个抽象类,它实现了大量注册为bean的具体类继承的大部分功能.bean通过自动装配定义.例如:
abstract class MyAbstract {
MyService myService
MyBean myBean
def doSomething() {
def value = myService.something(myBean)
}
}
class MyConcrete extends MyAbstract {
def concreteField
def doSomethingElse() {
def value = myService.somethingElse(myBean)
}
}
Run Code Online (Sandbox Code Playgroud)
CONF /弹簧/ resources.groovy:
myConcrete(MyConcrete) { bean ->
bean.autowire = true
myBean = ref(MySpecificBeanImpl)
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
当我在MyConcrete实例中运行方法doSomethingElse时,一切都按预期工作,并且通过DI用适当的值填充myService和myBean值.当我在MyConcrete实例中执行doSomething方法时,myService和myBean值都为null.似乎DI值在子类继承的抽象方法中不可见.真的太糟糕了.
我可以使用方法中的上下文持有者手动访问值,或者我可以使用修改的方法签名将值从子类传递给抽象父类,这些方法签名将这些值作为参数接受,但这些都不是好的解决方案.它完全打破了抽象类实现的有用性,并且需要大量我不想维护的复制代码.
更糟糕的是,在我的特定情况下,myBean的值实际上对于每个具体类是不同的,在resources.groovy文件中明确连接,因此泛型持有者方法不起作用.
我查看了一些与此相关的帖子,包括抽象类中的Grails服务,但没有太多结果来弄清楚发生了什么.抽象bean定义似乎是关于抽象bean定义属性,与抽象类和子类继承没有任何关系.
(1)这是Grails/Spring DI支持的限制吗?(2)抽象类还有什么我需要做的吗?