【问题标题】:grails custom GORM dialect prevent 'grails shell' to work - classpath mysterygrails 自定义 GORM 方言阻止“grails shell”工作 - 类路径之谜
【发布时间】:2015-02-24 11:56:46
【问题描述】:

我正在使用 Grails 2.3.11。

我的域类使用 UUID 作为在 MySQL 中存储为二进制 (16) 的标识符。我为 Hibernate 使用了一个非常简单的自定义方言,并将其放在 src/java 中:

class CustomMysqlDialect extends MySQL5InnoDBDialect {
  public CustomMysqlDialect() {
    super();
    registerColumnType(Types.BINARY,"binary(16)");
  }
}

然后在域类中我可以使用

static mapping = {
    id generator: 'uuid2',sqlType:'BINARY(16)'
...
}

除了grails shell 命令之外,所有这些都可以正常工作:

± |binary-uuid ✗| → grails shell
| Packaging Grails application.....
| Error Error executing script Shell: 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'transactionManagerPostProcessor': Initialization of bean failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean 
property 'sessionFactory'; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'sessionFactory': Invocation of init method failed; nested exception is 
org.hibernate.HibernateException: Could not instantiate dialect class (Use --stacktrace to see 
the full trace)

就像 src/java 中的类不会被添加到类路径中一样。

grails 控制台运行良好,我可以轻松查询/创建/更新我的域类,但我真的很怀念 shell 的交互性...

我也尝试将该类放入 grails-app/utils 中,但它并没有改变任何东西...

有什么想法吗?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    这对我来说很好。如果在启动 shell 之前运行 grails cleangrails compile 是否有帮助?还可以尝试将 --verbose --stacktrace 添加到 compileshell 命令 - 您可能会丢失警告或错误消息:

    $ grails clean
    $ grails compile --verbose --stacktrace
    $ grails shell --verbose --stacktrace
    

    请注意,grails-app/utils 的名称具有误导性。它不是用于实用程序类,而是用于编解码器。将所有不是 grails-app 工件(控制器、服务、编解码器等)的 Groovy 和 Java 代码放在 src/groovysrc/java 中。

    【讨论】:

    • 谢谢@Burt!我被 groovy 的默认公开类迷住了,忘记了公开这个 java 类!您的提示有助于找出异常的根本原因: 原因:java.lang.IllegalAccessException:类 org.hibernate.dialect.resolver.DialectFactory 无法在 sun.reflect.Reflection 访问带有修饰符“”的 CustomMysqlDialect 类的成员。 ensureMemberAccess(Reflection.java:65) ...org.hibernate.dialect.resolver.DialectFactory.constructDialect(DialectFactory.java:156) ... 371 更多
    • 现在你知道为什么run-app 脚本可以很好地与原始类一起工作,而shell 不会工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多