你最喜欢的Grailsdebugging技巧是什么?
Grails可能是一个有点长期堆栈转储debugging的熊。 解决问题的根源可能会非常棘手。 例如,我在BootStrap.groovy中烧了几次,例如“def foo = new Foo(a:a,b:b).save()”。 您最喜欢的debuggingGrails应用程序的技巧是什么?
一些一般的提示:
- 清除stacktrace.log,执行grails run-app,然后在查看器中打开stacktrace.log(我更喜欢在linux上使用
less stacktrace.log
)…一次在您的查看器中search.groovy和.gsp …你到了你真正关心的地方。 - 当一个
?showSource
一个GSP文件中的行号时,你应该在查询string中使用?showSource
在浏览器中打开该视图,即http://localhost:8080/myProject/myController/myAction?showSource
…这将显示编译的GSP源和堆栈跟踪中的所有GSP行号都是指编译的GSP,而不是实际的GSP源 - 总是总是围绕着你的保存,至less有一些最小的error handling。
例:
try { if(!someDomainObject.save()) { throw new Exception ("Save failed") } } catch(Exception e) { println e.toString() // This will at least tell you what is wrong with // the instance you are trying to save someDomainObject.errors.allErrors.each {error -> println error.toString() } }
除此之外,很多事情只是归结为识别堆栈跟踪和错误消息……很多时候,Grails在它给出的错误消息中是无法帮助的,但是您可以学习识别模式,如下所示:
- 一些最难理解的错误是因为你没有运行
grails clean
或grails upgrade
…为了避免这些问题,我总是在命令行上使用以下命令来运行grails:grails clean; yes | grails upgrade; grails run-app
grails clean; yes | grails upgrade; grails run-app
- 如果错误与类的重复定义有关,请确保在类的文件的顶部声明该类所属的包
- 如果错误与架构元数据,连接,套接字或类似的东西有关,请确保您的数据库连接器在
lib/
,确保您的权限在DataSource.groovy
和用户名,密码和数据库中都是正确的主机,并确保你知道你的连接器的版本的来龙去脉(即MySQL连接器版本5.1.X有一个怪异的问题,可能需要您在DataSource.groovy
的url上设置useOldAliasMetadataBehavior=true
)
等等。 有很多模式要学会认识。
-
为了补充Chris King关于保存的build议,我写了一个可重用的封闭:
Closure saveClosure = { domainObj -> if(domainObj.save()) println "Domain Object $domainObj Saved" else { println "Errors Found During Save of $domainObj!" println domainObj.errors.allErrors.each { println it.defaultMessage } } }
那么你可以在任何地方使用它,它会照顾错误报告:
def book = new Book(authorName:"Mark Twain") saveClosure(book)
-
此外,我使用debugging插件 – 它允许额外的日志logging,我添加标签到我的主底部 – 这给我一个会议/请求中的所有variables的视图。
-
运行时logging插件允许在运行时启用日志logging。
-
在编写这个答案的时候, P6SPY插件看起来也可能是有用的 – 它通过充当代理来logging你的应用程序对数据库的所有语句。
-
Grails控制台也很有用。 我使用它来交互式地查找和实验一些代码,这在debugging过程中也很方便。
-
当然,能够通过debugging器是可爱的。 我切换到IntelliJ IDEA,因为它具有最好的Grails / Groovy支持。
我曾经问过一个有经验的Groovy开发者,他是如何有效地debugging他的应用程序的。 他的回答是:
我写testing!
而且他有一个非常好的观点:如果你的代码有足够的单元和集成testing,你几乎不需要debugging任何东西。 另外,你还可以对你的开发者说这样的自鸣得意的事情…
对于Grails:
- unit testing
- functiontesting
- 真正优秀的Grails应用程序testingdeveloperWorks文章
用GrailsUtilloggingexception。
try{ ... }catch (Exception e){ log.error("some message", GrailsUtil.sanitize(e)) ... }
有关消毒的更多信息。
将此代码添加到Bootsrap.groovy:init将覆盖保存方法并执行一些其他代码,在这种情况下将输出错误消息。
class BootStrap { def grailsApplication def init = {servletContext -> grailsApplication.domainClasses.each { clazz -> clazz.clazz.get(-1) def gormSave = clazz.metaClass.getMetaMethod('save') clazz.metaClass.save = {-> def savedInstance = gormSave.invoke(delegate) if (!savedInstance) { delegate.errors.each { println it } } savedInstance } def gormSaveMap = clazz.metaClass.getMetaMethod('save', Map) clazz.metaClass.save = { Map m -> def savedInstance = gormSaveMap.invoke(delegate, m) if (!savedInstance) { delegate.errors.each { println it } } savedInstance } def gormSaveBoolean = clazz.metaClass.getMetaMethod('save', Boolean) clazz.metaClass.save = { Boolean b -> def savedInstance = gormSaveBoolean.invoke(delegate, b) if (!savedInstance) { delegate.errors.each { println it } } savedInstance } } ... }
希望帮助别人:)
(我知道它不是干的)
ref: http : //grails.1312388.n4.nabble.com/How-to-override-save-method-on-domain-class-td3021424.html
我不确定这是否可以开箱即用,但是在webapps中,我发现有一个“我是谁?”是有用的。 设施在各种查看文件。
这个想法是发送消息到呈现的HTML中,以确定片段。 当我第一次遇到应用程序时,情况尤其如此。
在Grails中,我使用自定义标签来做这件事。 例如,考虑学生的list.gsp:
<g:debug msg="student list" />
这里是代码:
class MiscTagLib { def debug = { map -> if (grailsApplication.config.grails.views.debug.mode == true) { def msg = map['msg'] out << "<h2>${msg}</h2><br/>" } } }
关键在于,如果需要,可以将这些标签保留在那里,因为它们只在Config.groovy中启用模式时显示:
grails.views.debug.mode=true
看着源代码! 这已经救了我很多次了! 现在代码托pipe在GitHub上比以前更容易了。 只需按下“t”,然后开始input,find您要找的课程!
这里有一些叽叽喳喳从Grails人收集@ groovymag技巧:
对于简单的应用程序,我使用println语句。这是非常非常简单的技巧。对于复杂的应用程序,使用intellij思想的debugging模式。