grails 控制器可以从基类扩展吗?如何让它不会爆炸?

Posted

技术标签:

【中文标题】grails 控制器可以从基类扩展吗?如何让它不会爆炸?【英文标题】:Can a grails controller extend from a base class? How to make it so grails doesn't blow up? 【发布时间】:2011-02-25 14:07:23 【问题描述】:

我编写了一个基类来帮助更快地构建我的控制器并消除重复。它提供了一些辅助方法、默认操作和一些元编程,使这些东西更容易构建。

基类中的其中一个方法是这样的:

def dynamicList(Class clazz) 
    def model = new LinkedHashMap()
    model[getMapString(clazz) + "s"] = list(clazz)
    model[getMapString(clazz) + "sTotal"] = count(clazz)

    model

调用它的动作,也在基类中,是这样的:

def list = 
    dynamicList(clazz)

不幸的是,当我在部署我的应用程序时在继承基类的控制器子类中列出操作时,我得到了这个异常:

groovy.lang.MissingMethodException: No signature of method: groovy.lang.MissingMethodException.dynamicList() is applicable for argument types: (java.lang.Class) values: [class project
.user.User]

    at project.user.UserController$_closure1.doCall(UserController.groovy:18)

    at project.user.UserController$_closure1.doCall(UserController.groovy)

    at java.lang.Thread.run(Thread.java:619)

我怎样才能在头上击中圣杯,然后告诉它做我想让它做的事情?我的控制器单元测试运行得很好,所以 grails 的运行时完全出错了:/

【问题讨论】:

【参考方案1】:

你确定你的继承是正确的并且你已经运行了 grails clean 等吗?您描述的情况应该可以正常工作。

【讨论】:

是的,我确定...我厌倦了圣杯。它是一件接一件的事情。我只是想开发软件,不知道规则的每一个例外,并且在我做之前知道我不能做的事情的清单。它实际上根本没有生产力。戈姆很棒。 gsps没问题。控制器太可怕了。 Groovy 也不是 Scala。动态语言很糟糕。感谢您的回答,但我只是对 grails 感到厌恶。 我不知道你在做什么,但我不明白你在控制器方面的困难与动态语言和静态语言有多大关系。抱歉,您对 Grails 有这种感觉,但我希望您能表达一些更具体的问题,以便有人可以帮助您解决。 动态与静态与控制器无关——这是一个框架问题,但测试控制器时的重构和代码完成支持是一个很大的痛苦。您确实必须了解所有动态知识才能测试控制器。我不能只输入“。”让我的 IDE 告诉我它是 renderArgs.view 或 redirectArgs.action。无法通过 IDE 支持“猜测”是一件非常非常糟糕的事情。我不想学习每一个小细节。 IDE 应该有助于加快学习曲线。动态语言对此很糟糕。 这是一个权衡。是的,您必须了解 API 并阅读文档。基本上,您是在用动态生产力、可读性和可维护性与样板帮助进行交易。那么你的牛肉就是动态语言。远离 Rails。 @ John Stoneham - 我对权衡是什么感到困惑。使用动态语言,您的工作效率会降低(因为您必须了解 API 并像您说的那样阅读文档),可读性降低(同样的,仅阅读代码是不够的,您还必须了解底层的所有工作原理) ,并且可维护性较低(主要是由于缺乏重构支持)。我非常同意这一点。但是,由于 IDE 无法为您自动完成内容,因此您在样板类型的内容方面获得的帮助也较少。那么有什么好处呢?【参考方案2】:

这就是全部代码吗?在dynamicList() 中调用list() 可能会遇到问题,因为它与操作匹配。换句话说,list()list.call() 的简写,它将调用 list 闭包。

肯定发生了一些非常奇怪的事情,因为异常说它在 MissingMethodException 类上找不到 dynamiclist() 方法。

你有可重现的例子吗?

【讨论】:

【参考方案3】:

我认为控制器是通过 grails 注入框架启动的,所以在这里使用奇怪的继承逻辑可能不是最好的方法。

虽然您可以使用组合而不是扩展基类。 有一个功能可以让您轻松地将服务注入控制器,因此您可以按功能将服务分组到服务中。 enter link description here

这是一个老问题,您可能会发现答案或技术有所发展。

自动注入适用于服务和控制器以及标签库。

【讨论】:

以上是关于grails 控制器可以从基类扩展吗?如何让它不会爆炸?的主要内容,如果未能解决你的问题,请参考以下文章

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

如何扩展 Sequelize 模型?

如何从基类调用派生类方法?

C++中子类从基类都继承啥?

如何使用多态性从基类访问派生类向量成员?

如何使 Python 模拟从基类派生?