首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails和PlayORM

Grails和PlayORM
EN

Stack Overflow用户
提问于 2013-06-17 15:55:28
回答 4查看 255关注 0票数 1

对于这个问题的混乱/复杂的描述和不断的编辑,我感到抱歉,但我还没有找到问题的根源。

我在Grails中使用PlayORM时遇到了困难: 1.存在依赖冲突,我可以通过从BuildPath和"/lib“文件夹中删除"logback-classic.jar”,但保留“公用日志”来解决这种冲突。有关这一问题的详情,见下文。2.现在我得到了一些奇怪的PlayORM异常,我认为这些异常很可能是由于删除了依赖关系:

代码语言:javascript
复制
| 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”或“test”时,我得到了以下错误消息:

代码语言:javascript
复制
| 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异常:

代码语言:javascript
复制
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,它与"Persistance.java”一起是"nosql“包的一部分。

最初的问题是:

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-20 18:55:50

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

票数 2
EN

Stack Overflow用户

发布于 2013-06-18 16:10:56

您在这里有多个问题--所有的问题都在一个问题中(看起来像3个单独的问题)。让我们先做一个比较简单的

错误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的不同jars。SLF4J可以在它下运行log4j,也可以使用log4j或jdk或logback(我最喜欢也是大多数人最喜欢的)或grails-plugin-log4j运行,这似乎有点奇怪。在下面。除此之外,任何第三方库都可以使用log4j或commons任何库,只要您有SLF4j适配器并删除log4j.jar和commons.jar,所有这些都将登录到您在下面放置的任何日志记录系统。在上面提供的语句中,您必须在providers经典下面使用logback.xml文件来记录所有日志(log4j、commons等)的配置,另一个是grails-plugin-log4j,它将拥有自己的日志配置file...not logback.xml。要解决这个问题,只需确保want...we的jar使用logback一个即可。

下两期可能是相关的

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

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

代码语言:javascript
复制
ERROR plugins.DefaultGrailsPlugin  - Cannot generate controller logic for scaffolded class class nosql.Transaction. It is not a domain class!

我将更深入地研究,因为当类加载问题也发生时,我们试图获得更好的异常。我也不知道grails在类加载中做了什么。

票数 0
EN

Stack Overflow用户

发布于 2013-06-18 16:34:07

好的,关于类的第一个问题,在这个问题上有一些特殊的日志,当只启用调试级别日志时,这些日志就会正常运行。它捕捉到了它是如何两次进入那个代码的。有一段有趣的代码是在ScannerForClass.processIdFieldWorks中存在的。

代码语言:javascript
复制
if(field.equals(existingField) && log.isWarnEnabled()) 

而您的代码应该走上这条道路,但没有。也许,您并没有记录警告日志,或者您为SLF4j使用的绑定中的配置没有使其具有很好的效果……我刚刚检查了对playorm的更改以删除它。如果您的字段不等于基于existingField的toStrings,那么肯定是类加载问题,我将添加更多的日志,以可能帮助确定如何加载该类两次。

确保您也是在调试级别登录,这样它就不会像第一个调用的堆栈跟踪那样记录为null。(从根本上说,这个方法中发生了两个对DboTableMeta的调用,这是不应该发生的,因为@NoSqlId....well只有一个字段,只允许一个字段)

谢谢,迪恩

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17151803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档