1

对于问题的凌乱/复杂的描述和不断的编辑,我感到抱歉,但我还没有查明根本问题。

我在将 PlayORM 与 Grails 一起使用时遇到了困难: 1. 存在依赖冲突,我可能已经通过从 BuildPath 和“/lib”文件夹中删除“logback-classic.jar”解决了这个问题,但保留了“commons-logging”。有关该问题的详细信息,请参见下文。2. 现在我得到了一些奇怪的 PlayORM 异常,我认为这可能是由于删除了依赖项:

| Loading Grails 2.2.1
| Configuring classpath.
| Environment set to development.....
| Packaging Grails application.....
| Running Grails application
| Error 2013-06-18 10:38:31,057 [Thread-8] ERROR plugins.DefaultGrailsPlugin  - Cannot generate controller logic for scaffolded class class nosql.Transaction. It is not a domain class!
| Server running. Browse to http://localhost:8080/gibb
java.lang.RuntimeException: Failure scanning class(see chained exception)=class com.alvazan.orm.api.z8spi.meta.DboTableMeta
    at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:50)
.......
**Caused by: java.lang.RuntimeException: Failure scanning field=private java.lang.String com.alvazan.orm.api.z8spi.meta.DboTableMeta.columnFamily for class=DboTableMeta
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectField(ScannerForClass.java:209)
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.scanFields(ScannerForClass.java:202)
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.scanSingle(ScannerForClass.java:122)
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.addClass(ScannerForClass.java:80)
    at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:48)
    ... 107 more
Caused by: java.lang.IllegalArgumentException: class=class com.alvazan.orm.impl.meta.data.MetaClassSingle has two fields that have @NoSqlId annotation.  One of them may be in a superclass.  The two fields are=private java.lang.String com.alvazan.orm.api.z8spi.meta.DboTableMeta.columnFamily and=private java.lang.String com.alvazan.orm.api.z8spi.meta.DboTableMeta.columnFamily
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.processIdFieldWorks(ScannerForClass.java:253)
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectFieldImpl(ScannerForClass.java:220)
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectField(ScannerForClass.java:207)
    ... 111 more**

笔记:


最初的问题:基本上我在 Grails 上执行“run-app”或“test-app”时收到以下错误消息:

| Loading Grails 2.2.1
| Configuring classpath
| Error SLF4J: Class path contains multiple SLF4J bindings.
| Error SLF4J: Found binding in [jar:file:/home/saasbook/Dropbox/Projects/GrailsWorkSpace/gibb/lib/logback-classic-1.0.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
| Error SLF4J: Found binding in [jar:file:/home/saasbook/.grails/ivy-cache/org.grails/grails-plugin-log4j/jars/grails-plugin-log4j-2.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

该应用程序会运行,但在尝试将对象刷新到数据库时会出现 PlayORM 异常:

java.lang.IllegalArgumentException: Entity type=nosql.Transaction was not scanned and added to meta information on startup.  It is either missing @NoSqlEntity annotation or it was not in list of scanned packages

注意:“Transaction.java”类确实有@NoSqlEntity,并且是“nosql”包的一部分,以及“Persistance.java”。


最初的问题:

DEBUG o.c.g.g.i.s.PathMatchingResourcePatternResolver当我尝试“运行应用程序”或“测试应用程序”甚至“清理”时,我的 grails 应用程序会生成数百条语句。该应用程序从 Eclipse 运行,但测试不运行。

重要的细节是 - 我从本地 git 存储库中签出应用程序,原始应用程序在同一台机器上运行得非常好。


对评论的回应: 1. 测试根本没有运行。2. 我没有更改 log4j 设置中的任何内容。3.发布这个问题后,我运行了应用程序的原始副本(在不同的目录中),它产生了与第一个相同的垃圾。我虽然问题是 grails 将应用程序设置保存在 ~/.grails/2.2.1/projects/{myProjectName} 但即使应用程序的单个“版本位置”仍然存在。

4

4 回答 4

2

这个问题通过传入 Transaction.class 的 ClassLoader 离线解决,因为 grails 正在玩类加载游戏,而 playorm 是父类加载器,Transaction.class 在加载 playorm 的类加载器中不可见。

于 2013-06-20T18:55:50.707 回答
0

您在一个问题中遇到了多个问题(看起来像 3 个单独的问题)。让我们先做一个更简单的

错误 SLF4J:类路径包含多个 SLF4J 绑定。| 错误 SLF4J:在 [jar:file:/home/saasbook/Dropbox/Projects/GrailsWorkSpace/gibb/lib/logback-classic-1.0.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定 | 错误 SLF4J:在 [jar:file:/home/saasbook/.grails/ivy-cache/org.grails/grails-plugin-log4j/jars/grails-plugin-log4j-2.2.1.jar!/org/ 中找到绑定slf4j/impl/StaticLoggerBinder.class]

这仅仅是因为 SLF4J 的工作方式,不允许使用具有 StaticLoggerBinder.class 的不同 jar。SLF4J 可以在其下运行 log4j 或 commons 或 jdk 或 logback(我最喜欢,大多数人更喜欢)或你的 grails-plugin-log4j,这看起来有点奇怪。那是下面。在它上面,你吸的任何第 3 方库都可以使用 log4j 或 commons 或任何库,只要你有 SLF4j 适配器并删除 log4j.jar 和 commons.jar,所有这些都将记录到你放在下面的任何日志系统。在您提供的上述声明中,您必须在提供者 logback-classic 下面使用 logback.xml 文件来记录所有日志记录(log4j、commons 等)的配置,另一个是 grails-plugin-log4j,它将拥有自己的日志记录配置文件...不是 logback.xml。为了解决那个问题,

下两个问题可能是相关的

java.lang.IllegalArgumentException: Entity type=nosql.Transaction 未被扫描并在启动时添加到元信息中。它要么缺少 @NoSqlEntity 注释,要么不在扫描包列表中

我在这里打赌一个类加载问题。如果例如 Transaction(1).class 被扫描,但 Transaction(2).class 被传递到 entityManager.put(tx),那么您将遇到此失败。grails 是否在 Transaction.java 上进行字节码操作,因为这条线看起来很可疑......

ERROR plugins.DefaultGrailsPlugin  - Cannot generate controller logic for scaffolded class class nosql.Transaction. It is not a domain class!

当类加载问题发生时,我会更深入地研究,因为我们正试图获得更好的异常。我也不确定 grails 在类加载方面有什么技巧。

于 2013-06-18T16:10:56.803 回答
0

对于这个问题

java.lang.IllegalArgumentException: Entity type=nosql.Transaction was not scanned and added to meta information on startup. It is either missing @NoSqlEntity annotation or it was not in list of scanned packages  

原因可能是,您的类路径中没有 nosql.Persistence 类。请参阅http://buffalosw.com/wiki/FAQ/上的相关常见问题解答

于 2013-06-19T07:08:14.457 回答
0

好的,所以关于 classlaoding 问题的第一个问题,只有在启用调试级别日志记录时才会启用此问题的特殊日志。它捕获了它是如何两次进入该代码的。一段有趣的代码在 ScannerForClass.processIdFieldWorks 中,其中存在

if(field.equals(existingField) && log.isWarnEnabled()) 

你的代码应该走这条路,但没有走。也许,您没有记录警告日志,或者您用于 SLF4j 的绑定中的配置没有使它在那里 soooooo ......我刚刚签入了对 playorm 的更改以删除它。如果您的字段不等于基于 toStrings 的现有字段,那么这绝对是一个类加载问题,我将添加更多日志以可能有助于确定该类如何被加载两次。

确保您也在调试级别记录,因此它不会将 null 记录为第一次调用的堆栈跟踪。(基本上 DboTableMeta 上的两个调用发生在此方法中,这永远不会发生,因为只有一个带有 @ 的字段NoSqlId....好吧,只允许一个)

谢谢,院长

于 2013-06-18T16:34:07.110 回答