使用grails run-app
运行应用程序工作正常,但在Tomcat 7中部署后,我收到以下错误。
groovy.lang.MissingMethodException:
No signature of method: static com.digithurst.hdspro.web.Responder.respond()
is applicable for argument types: (ResourceListCmd, QueryCmd, groovy.util.ConfigObject)
values: [ResourceListCmd@5c380e, ...]
Possible solutions: respond(HttpResource, java.lang.Object, java.lang.String)
如前所述,这可以在Tomcat之外使用。调用方法的方式与实现方式完全相同。 ResourceListCmd
实现了接口HttpResource
,使其非常适合。如果第一个参数为null
,则会发生此错误。
groovy.lang.MissingMethodException:
No signature of method: static com.digithurst.hdspro.web.Responder.respond()
is applicable for argument types: (null, QueryCmd, groovy.util.ConfigObject)
values: [null, ...]
Possible solutions: respond(HttpResource, java.lang.Object, java.lang.String)
有关环境的更多信息:
我已经清除了用户目录中的.grails
和.m2
文件夹,并在创建war文件之前执行了grails clean
。
[在回答H3rnst之后编辑]
控制器:
def index() {
try {
ResourceListCmd configs = configService.search()
respond Responder.respond(configs, new QueryCmd(level: 'list'),
grailsApplication.config.grails.serverURL)
}
catch (Exception e) {
render status: INTERNAL_SERVER_ERROR
}
}
ResourceListCmd:
interface HttpResource {
...
}
abstract class AbstractHttpResource implements HttpResource {
...
}
class ResourceListCmd extends AbstractHttpResource {
...
}
响应:
class Responder {
static def respond(HttpResource resource, def query, String serverURL) {
...
}
}
答案 0 :(得分:0)
您的war(或tomcat服务器类路径)包含包含com.digithurst.hdspro.web.Responder类的jar的重复版本或错误版本。 (您正在使用run-app开发启动的类的版本与运行您的战争的tomcat加载不同)
您可以尝试解压缩战争结束验证有问题的jar的版本和/或使用jarscan之类的工具来扫描重复的类。
您甚至可以尝试使用命令dependecy-report并搜索同一lib的重复注入。您正在使用的两个不同的插件可能会合并到导致问题的同一个lib的不同版本中。
答案 1 :(得分:0)
marko's建议做run-war
实际上给出了解决这个问题的最终线索。这不是Tomcat的问题,而是应用程序运行的环境。run-app
以及run-war
默认使用“开发”环境,因此它起作用。仅在“生产”中它没有,这是部署到Tomcat时使用的。
实际的罪魁祸首是配置的一部分,错误信息是正确的,虽然出乎意料。我正在使用Responder.respond()
调用grailsApplication.config.grails.serverURL
方法。 serverURL
仅设置为“开发”模式,而不是“生产”模式。这就是Groovy / Java抱怨方法签名的原因:
(ResourceListCmd, QueryCmd, groovy.util.ConfigObject) vs (HttpResource, java.lang.Object, java.lang.String)
线索是最后一个参数,前两个是正确的。但是,我希望null
为值,而不是完全不同的类型。