【问题标题】:Extending RestfulController for a base SubClassRestfulController is not working on grails 3.0.4为基本 SubClassRestfulController 扩展 RestfulController 不适用于 grails 3.0.4
【发布时间】:2015-11-17 08:07:47
【问题描述】:

According to Extending Restful Controller

我可以创建这个 RestfulController 的子类,成为我想要的每个 REST 控制器的基本控制器类。

可以将其子类化为 DIRECT 资源控制器。

Class BooksController extends RestfulController {
BooksController() {super(Book)}

但如果我按照 grails DOC 创建一个像这样的基本控制器:

class MyRestController<T> extends RestfulController<T> {
static responseFormats = ['json', 'xml']
MyRestController(Class<T> domainClass) {this(domainClass, false)}
MyRestController(Class<T> domainClass, boolean readOnly) {
    super(domainClass, readOnly)
}

我遇到了一个错误:

Failed to instantiate [clash.MyRestController]: No default constructor found;

我尝试将这个控制器放在控制器文件夹或 src 文件夹中。

仅当我创建默认构造函数时才有效,但这不是我想要的。我不希望此类为任何域类提供 API,但我想创建扩展此类的新控制器。

class BooksController extends MyRestController {
BooksController() {super(Book)}

【问题讨论】:

    标签: rest grails controller


    【解决方案1】:

    问题是该类被识别为控制器并且框架正在尝试创建控制器的实例。我们用来确定是否应该发生这种情况的标准之一是我们检查该类是否是抽象的。有问题的类应该被标记为抽象的

    使其工作的一种方法是将其移出grails-app/controllers 目录并在src/main/groovy/ 下定义它。

    【讨论】:

    • 谢谢杰夫。但在我看到你的答案之前,我运行了一个干净的 grails 并开始工作。不是我得到新的疯狂错误。我会试着弄清楚发生了什么,也许我会发布另一个问题。谢谢
    • 这让我很吃惊,除非控制器被移出controllers 文件夹。
    • Adrian,我不必将控制器类标记为抽象。代码运行良好。我相信这是一个缓存问题或类似的东西。我只是将控制器 MyRestController 放在 src/main/groovy 文件夹中,并使用常规控制器对其进行扩展。例如。 MyConcreteController 类扩展 MyRestController。 ** 不需要在类声明上加上抽象。 ** 我真的不知道为什么它不起作用
    • @JeffScottBrown 您能否将答案从标记为抽象更改为“已移出控制器文件夹,正如您评论的那样。我会将其标记为正确答案,因为确实控制器必须不在该文件夹中。
    • 我不明白为什么有人反对开设课程abstract。实际上应该将其设为abstract,除非您出于某种原因想要直接创建其中一个,而您不应该这样做。
    【解决方案2】:

    对不起。只需清理并运行应用程序即可解决问题。我的错

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2016-05-20
      • 2019-02-26
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多