提问者:小点点

Grails 3-使用特征从插件添加动态方法-不起作用


我只是按照用户指南使用插件中的trait向控制器添加动态方法。

以下是我的代码:

---Trait---

package com.ylw.gorm

trait DateTrait {
Date currentDate() {
    return new Date()
}
}

---TraitInject

package com.ylw.gorm

import grails.compiler.traits.TraitInjector
import groovy.transform.CompileStatic


@CompileStatic
class ControllerTraitInjector implements TraitInjector {

@Override
Class getTrait() {
    DateTrait
}

@Override
String[] getArtefactTypes() {
    ['Controller'] as String[]
}
}

---控制者---

@Transactional(readOnly = true)
class MyDomainController {

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

def testTrait() {
    render "The current date is -> " + currentDate()
}

...
}

我希望控制器能从trait中知道当前日期()方法。但是我在浏览器中得到了以下错误:

由MissingMEODException引起:没有方法的签名:com. ylw.gorm.MyDomainController.当前日期()适用于参数类型:()值:[]可能的解决方案:create()90|在grails.artefact.gsp.TagLibraryInvoker$Trait$Helper - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 12|$tt__testTrait在com.ylw.gorm.envers.AuditedDomainController 93|doInTransaction in grails.transaction.GrailsTransactionTemplate2$90|在grails.transaction.GrailsTransactionTemplate 1145|runWorker in java.util.concurrent.ThreadPoolExecator 615|在java.util.concurrent.ThreadPoolExecator$Worker 745|在java.lang.Thread中运行 . . .

我做错了什么?

谢谢帮忙!英良


共1个答案

匿名用户

您没有显示足够的代码来确定出了什么问题。

我在https://github.com/jeffbrown/traitplugin.创建了一个演示应用程序

请参阅以下内容:

https://github.com/jeffbrown/traitplugin/blob/b76af469a0695a449f28c43479ce60d9081c252e/datehelper/src/main/groovy/com/ylw/gorm/ControllerTraitInjector.groovy

https://github.com/jeffbrown/traitplugin/blob/b76af469a0695a449f28c43479ce60d9081c252e/datehelper/src/main/groovy/com/ylw/gorm/DateTrait.groovy

这些是从您的示例代码中复制和粘贴的。

该应用程序在以下位置有一个控制器:

https://github.com/jeffbrown/traitplugin/blob/b76af469a0695a449f28c43479ce60d9081c252e/demo/grails-app/controllers/demo/MyDomainController.groovy

所有这些似乎都奏效了。

确保您的应用对插件具有编译时依赖性。