小编Ste*_*ole的帖子

在Grails控制器中使用Groovy特征

我想在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注释没有任何意义(没什么大惊喜).

grails groovy

8
推荐指数
1
解决办法
1952
查看次数

如何在抽象类方法中访问注入的Grails bean?

我有一个抽象类,它实现了大量注册为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)抽象类还有什么我需要做的吗?

grails spring

2
推荐指数
1
解决办法
1374
查看次数

标签 统计

grails ×2

groovy ×1

spring ×1