你最喜欢的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 cleangrails 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您要找的课程!

http://github.com/grails/grails-core

这里有一些叽叽喳喳从Grails人收集@ groovymag技巧:

http://blog.groovymag.com/2009/02/groovygrails-debugging/

对于简单的应用程序,我使用println语句。这是非常非常简单的技巧。对于复杂的应用程序,使用intellij思想的debugging模式。