Grails 2.3.4 War在Tomcat 7.0.47中无法正常工作

时间:2013-12-27 12:50:42

标签: grails tomcat7

使用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)

有关环境的更多信息:

  • Windows 7 64位
  • Java 7 U45 x86
  • Grails 2.3.4
  • Tomcat 7.0.47

我已经清除了用户目录中的.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) {
        ...
    }
}

2 个答案:

答案 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为值,而不是完全不同的类型。