【问题标题】:Grails Enum Works on Jetty, breaks on TomcatGrails Enum 在 Jetty 上工作,在 Tomcat 上中断
【发布时间】:2010-07-08 17:11:46
【问题描述】:

我已经开发了这个小应用程序并在 Jetty 上运行它没有任何问题...

Bug.groovy:

package itsafeature

class Bug {

    String name
    String description
    Priority priority

    Project project

    static belongsTo = Project

    static constraints = {
        name(size:10..150)
        description(size:25..1500)
        project(nullable:false)
        priority(nullable:false)
    }

    String toString() {
        return "${priority}:${name}"
    }
}
enum Priority {HIGH(5), MEDIUM(3),LOW(1)
    private Priority(int val){
        value = val
    }
    private final int value
    int value() {
        value
    }
}

当我使用 Netbeans 直接部署到它的 Grails Jetty 服务器时,这完全符合您的预期。优先级作为字符串写入我的数据库,它可以满足我的需求。

但是,如果我接受该项目并进行“构建”,它会创建应用程序的“生产”构建(我的数据源文件对于所有构建都是相同的),并将其放在我的“webapps”文件夹中本地 tomcat 服务器,我看到以下堆栈跟踪:

SEVERE: Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
        ... SNIP! ...
Caused by: java.lang.ExceptionInInitializerError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
Caused by: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Priority(java.lang.String, java.lang.Integer)
        at Priority.<clinit>(Priority.groovy:10)
        ... 2 more

我应该看什么来缩小这个问题的范围?我在 Windows 上只安装了一个 groovy, GROOVY_HOME 指向它,与 GRAILS 相同。 Jetty 是否有自己的这些运行时版本?还是这真的是应用服务器问题?

有一个 grails 命令说“tomcat”,不确定是否与此有关,但我没有使用它

【问题讨论】:

    标签: tomcat grails jetty enums


    【解决方案1】:

    将枚举移动到 src/groovy 中自己的文件中(在同一个包或另一个包中,但它不能在默认包中,并且不能被包中的域类访问)。

    顺便说一句 - 你不需要 Groovy 或 GROOVY_HOME 与 Grails - 它带有它所使用的 Groovy jar 版本,并且可以部署在你的战争中。

    【讨论】:

    • Soooo... 我已经接受了你的回答,所以我只能感谢你对此的任何回应,但以防万一你觉得仁慈。你怎么知道的?知道为什么会这样吗?如果它不能正常工作,那将是一回事,但它在码头而不是 tomcat 上工作的事实让我很困惑。再次感谢!我终于可以摆脱所有这些懒惰的域对象了
    • 抱歉,我不知道为什么它在 Jetty 中有效。从错误看来,枚举被视为域类,因为某些东西(您的堆栈跟踪被切断)正在尝试使用默认构造函数实例化一个新实例。 Grails 在启动期间实例化工件以检查属性,看起来这两个类都(至少部分地)被视为域类。因此,将枚举放在 src/groovy 或 src/java 中可以解决问题,而且这可能是正确的做法,因为它可能会在其他地方使用,而不仅仅是您的域类。
    猜你喜欢
    • 2014-07-05
    • 2012-09-07
    • 2020-09-06
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多