Grails开发经验

最近用grails开发,一路入坑多次,跌跌撞撞总算快走上坦途了。

该记的记,该忘的忘,想起来就随便写在这里吧。

  • IDEA U版是grails开发的神器,STS之流无法相提并论,本来以为SpringSource收购Grails会有很好的发展,从工具的支持来看还是不够好。
  • IDEA当前版本ultimate 11.1( IU117.418 )有一个对grails setting同步的bug,如果提示“Grails not found”或者<r:resource>标签显示为红色(grails resources plugin未识别的缘故),请点击bug: http://youtrack.jetbrains.com/issue/IDEA-86261 ,第三条回复中已经有补丁可下。
  • IDEA内存调到1024M吧,默认配置对开发grails实在是太卡了。
  • Groovy的官方文档够烂!不管是UserGuide还是javadoc,质量和内容丰富度都无法令人满意。用动态脚本语言的常识连蒙带猜吧,总体来说语法对熟悉javascript、ruby之流的程序员还算没压力,但是javadoc太简陋实在无法忍受。
  • 在我的开发期间grails2.1.0rc2升级到2.1.0,并无特殊更新。grails upgrade执行一下,看看结果只是修改了application.prop*文件而已。
  • JDK7.0并未有多少性能提升,似乎有反效果,我又降级到了JDK6.0,当然也可能是64bit的缘故。
  • Grails对mingw和cygwin的支持都不好,折腾一番还是用回cmd。虽然Thinkpad W520很强,但面对Macbook Pro 15“ retina版的艳光四射真心无法hold啊,口水口水。但是买这个得有心理准备,因为很多软件还没有支持retina,小心你的眼神。不过好消息是eclipse已经支持了。还不完美
  • 如果在Servlet Filter中进行了HttpSession保存entity之后读取的这样的蠢事,你就经典爆了: LazyInitializationException - could not initialize proxy no Session.虽然Grails内置了OSIV,但这是用Spring的拦截器实现的,对更前面的Filter无效。解决方案很多,可以用lazy:false,可以重新attach(),可以只保存对象id,要用的时候重读
  • Grails经常抛出一些莫名其妙的异常,完全摸不着头脑。举例我有一个domain class :mpa.Menu,还有一个annotation class:mpa.annotation.Menu,若干次重启后(注意不是第一次重启)报错:
    Missing type or column for column[menus menu] on domain[User Group] referencing[mpa.Menu]
     猜测是命名冲突(包名不同,这也会?),删除mpa.annotation.Menu,重启还是依旧。这里得提一下Grails的缓存太厉害了,你得执行grails clean命令,该问题才得以解决。类似问题层出不穷,不过值得赞的是grails在其他时候有很友好的api提示,譬如request.uri写错为request.uro,他会给你possible method。这点很贴心。
  • Grails的文档不错,能得到大多数情况下的帮助,当然最根本的是你得精通它背后的技术:Java、Spring\Hibernate\... ,总是有问题会让你google到stackoverflow去.
  • Grails的插件很好用!
  • shiro是个很好的权限系统,比起Acegi简单清晰,虽然我自己写了一个,但还是值得推荐。
  • Groovy在6月份发布了2.0, Grails2.1还未支持该版本。Groovy2.0越来越像Scala了,静态类型检查、静态编译,很期待这个版本的发展。因为我实在无法对scala的语法报什么好感。
  • many-to-one(hasMany,belongsTo=DomainClass)和many-to-many (hasMany,belongsTo=DomainClass) 都是用join-table实现的,但后者的jointable具有复合主键.
  • hasMany对应的collection可以使用clear()清空
  • static belongsTo=domain; static belongsTo=[domain:DomainClass]是不同的,后者还多声明了一个关联属性,相对详细的资料可以看这里
  • <g:img><r:img>都不支持中文路径,囧.
  • 在dev模式下,grails会自动reload,因此它会对app的文件进行监视,这导致了上传文件无法覆盖原文件,例如,上传图片到web-inf/images/下,会抛出IOException(exists and cannot delete), 详细的说明可以查看这个
  • equals()里用getClass() != o.class 对domain class来说是不可靠的,因为你看到的其实是包装类.要用 instanceof

 

你可能感兴趣的:(grails)