- 浏览: 951288 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
sscsacdsadcsd:
mike8625 写道react还要自己的一些标签 还得编译 ...
对于React体系的一点想法 -
mike8625:
说的都是给大公司听的,国内很多还是小公司,做个小项目, 说实话 ...
关于国内前端和JS技术发展的乱想 -
mike8625:
react还要自己的一些标签 还得编译 编译吧浏览器端说还慢 ...
对于React体系的一点想法 -
u012814086:
下意识想到了Golang
JavaScript语句后应该加分号么? -
xueduanyang:
我是水羊,年轻的时候觉得只要有好斧子就能做成好产品,各种产品都 ...
关于国内前端和JS技术发展的乱想
最近在摆弄Grails,感觉Grails还是很好用的,不过还是遇到一些小问题。因为是基于groovy这样的动态语言,因此许多问题是要到运行时才抛出异常,而有些时候所抛出的异常并不能反应问题的实质,结果往往令人摸不到头脑,从而构成了陷阱(gotchas)。我也经过了多次这样的抓狂经历。
Grails陷阱之一:Domain Class 中的关联不能指向抽象类
Grails的domain class可以继承抽象类。比如:
上述代码可以编译和运行成功。
如果我们给Person加上一个pets关联的话:
结果可以编译,但是运行时出现异常:
光看这些异常你肯定丈二和尚摸不着头脑。我就在这个上栽了跟头,浪费了好多时间去定位问题根源。
问题本身其实不难理解,涉及到数据库关联的,不管是一对一、一对多或多对多,都要指向一个实际的数据库表,而grails是不会为抽象类建立对应的数据库表的,也就是说,在grails中抽象类本身并不是domain class,而只是提供了一种代码复用的手段(也就是节约了一点重复性代码,减少了一些C&P)。
解决方法很简单,就是把Pet抽象类改为具体类,或者修改你的关联,不要关联到抽象类,而是直接关联到具体类。
类似的,如果你关联了一个interface,也会抛出差不多的异常,不过在/grails-app/domain下放置interface会编译失败,你必须放到/src/groovy下,而所以一般来说你不太会遇到interface的问题。
Grails陷阱之一:Domain Class 中的关联不能指向抽象类
Grails的domain class可以继承抽象类。比如:
abstract class Pet { String name boolean eat(Food food) { println("$name is eating ${food.toString()}...") } } class Cat extends Pet { } class Dog extends Pet { } abstract class Food { } class Fish extends Food { String toString() { 'a fish' } } class Bone extends Food { String toString() { 'a bone' } } class Person { String name boolean feed(Pet pet, Food food) { pet.eat(food) } } /**********************************************************/ import grails.test.* class FeedPetTests extends GrailsUnitTestCase { protected void setUp() { super.setUp() } protected void tearDown() { super.tearDown() } void testFeed() { def hax = new Person(name:'Hax') def tom = new Cat(name:'Tom') def snoopy = new Dog(name:'Snoopy') def fish = new Fish() def bone = new Bone() hax.feed(tom, fish) hax.feed(tom, bone) hax.feed(snoopy, fish) hax.feed(snoopy, bone) } }
上述代码可以编译和运行成功。
--Output from testFeed-- Tom is eating a fish... Tom is eating a bone... Snoopy is eating a fish... Snoopy is eating a bone...
如果我们给Person加上一个pets关联的话:
class Person { static hasMany = [pets:Pet] // 关联到抽象类Pet String name boolean feed(Pet pet, Food food) { pet.eat(food) } }
结果可以编译,但是运行时出现异常:
gant.TargetExecutionException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is java.lang.NullPointerException at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:331) at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334) at gant.Gant$_dispatch_closure6.doCall(Gant.groovy) at gant.Gant.withBuildListeners(Gant.groovy:344) at gant.Gant.this$2$withBuildListeners(Gant.groovy) at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) at gant.Gant.dispatch(Gant.groovy:334) at gant.Gant.this$2$dispatch(Gant.groovy) at gant.Gant.invokeMethod(Gant.groovy) at gant.Gant.processTargets(Gant.groovy:495) at gant.Gant.processTargets(Gant.groovy:480) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is java.lang.NullPointerException at java.security.AccessController.doPrivileged(Native Method) at _GrailsBootstrap_groovy$_run_closure2_closure13.doCall(_GrailsBootstrap_groovy:86) at _GrailsBootstrap_groovy$_run_closure2_closure13.doCall(_GrailsBootstrap_groovy) at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:269) at _GrailsBootstrap_groovy$_run_closure2.doCall(_GrailsBootstrap_groovy:84) at _GrailsBootstrap_groovy$_run_closure7.doCall(_GrailsBootstrap_groovy:142) at _GrailsTest_groovy$_run_closure7.doCall(_GrailsTest_groovy:238) at _GrailsTest_groovy$_run_closure7.doCall(_GrailsTest_groovy) at _GrailsTest_groovy$_run_closure1_closure19.doCall(_GrailsTest_groovy:106) at _GrailsTest_groovy$_run_closure1.doCall(_GrailsTest_groovy:92) at TestApp$_run_closure1.doCall(TestApp.groovy:66) at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324) ... 10 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is java.lang.NullPointerException at java.security.AccessController.doPrivileged(Native Method) ... 22 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is java.lang.NullPointerException at java.security.AccessController.doPrivileged(Native Method) ... 23 more Caused by: java.lang.NullPointerException ... 24 more
光看这些异常你肯定丈二和尚摸不着头脑。我就在这个上栽了跟头,浪费了好多时间去定位问题根源。
问题本身其实不难理解,涉及到数据库关联的,不管是一对一、一对多或多对多,都要指向一个实际的数据库表,而grails是不会为抽象类建立对应的数据库表的,也就是说,在grails中抽象类本身并不是domain class,而只是提供了一种代码复用的手段(也就是节约了一点重复性代码,减少了一些C&P)。
解决方法很简单,就是把Pet抽象类改为具体类,或者修改你的关联,不要关联到抽象类,而是直接关联到具体类。
类似的,如果你关联了一个interface,也会抛出差不多的异常,不过在/grails-app/domain下放置interface会编译失败,你必须放到/src/groovy下,而所以一般来说你不太会遇到interface的问题。
发表评论
-
关于exclusive range运算的符号
2015-07-16 11:32 2373大概去年这个时候 Swift 语言把 half-open r ... -
短址域名选择
2013-06-15 15:54 6638什么是短址,请看 http://en.wikipedia.or ... -
IE与Vary头
2012-08-13 01:54 5538这两天写Jedi时涉及到一 ... -
关于国内前端和JS技术发展的乱想
2011-07-19 18:53 33035玉伯在我的一条微博后面写了一些(和主题不是很相关但)非常值得思 ... -
两页技术图书广告震精了我们
2010-12-20 15:25 4236在去D2的高铁上,老赵 ... -
每个Web开发者都应读的文章:HTML5设计原理
2010-12-15 10:49 5456李松峰最近翻译了两篇关于HTML5的文章,尤其是《HTML5设 ... -
声明:本人停止更新JavaEye博客15天
2010-11-05 03:07 208313 小时前 JavaEye管理员 发给 我 的消息 正文: ... -
活动预告:子斌介绍HTML5 & CSS3的讲座
2010-07-30 17:46 1451主题:HTML5 & CSS3 演讲:子斌(Opera ... -
全角字符到底有哪些
2010-06-22 07:30 8735老是有人弄什么一个中 ... -
所谓标准
2009-11-09 19:24 3481稍微看了一下uoml。 uoml已经从公司内部技术文档跨越了 ... -
偶对django的rant
2009-04-04 05:29 5961本文乃我半夜不爽的咆哮之作。django的忠实fans可无视本 ... -
Grails陷阱之三
2009-03-21 00:25 0unit测试 vs integration测试 http:// ... -
Grails陷阱之二
2009-03-18 15:32 5127前篇:Grails陷阱之一 Grails陷阱之二:跨requ ... -
牛人人气排行榜
2008-12-22 19:03 3805见:http://www.codersatwork.com/n ... -
GIT相关资源
2008-12-10 00:50 2034实在没法……俺需要Windows平台下的GIT工具,收罗如下: ... -
轻量级的语言解析的基础问题
2008-04-17 02:12 3854本文延续上一篇blog,对 ... -
Apache与SPNEGO备忘
2008-03-08 00:21 5296过去配置过一次,有很 ... -
在Fedora上安装Subversion和Apache 2.2
2007-09-27 17:57 4287最近一个项目要起svn和trac。我的fedora core ... -
失败的定制浏览器案例
2007-08-22 18:39 3001刚才过去公司的同事电话来问我以前写的一些代码的事情。我问了一下 ...
相关推荐
Grails Grails Grails Grails Grails
Grails开发之(Rest教程).pdf
Grails开发之(Rest教程).docx
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...
grails的插件系统也是其亮点之一。首先,和rails,django等web框架类似,基于微内核的思想,插件(可重用模块)是框架的一等公民。grails除了核心模块以外的功能几乎都是通过插件方式实现的。实际上,一个grails插件...
Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。
Grails建立在这些概念之上,它极大地降低了在Java平台上建立Web应用的复杂性。与那些框架不同的是,Grails是构建在现有的像Spring、Hibernate这样的Java技术之上。 Grails是个一栈式开发框架,它尝试通过核心技术...
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
grails+Xfire webservice
grails-2.1.zip.001
grails grails入门经典 grails入门 grails例子 grails资料 通过自学一点点积累起来的,相信对你有帮助的。
Grails尽量为更多现有的Java项目创建一个全面的框架(不仅局限于视图处理),这和当前一些Java框架提供给用户的一种AnemicAPI形成了明显的对比。Grails的出现并不是偶然的,而是随着Web应用的日趋复杂及Web2.0和Ajax...
Grails 中文 参考手册
像Rails,Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路,Grails基于这些概念之上,采用动态方法减小了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构建在Spring和...
Grails1.1最新 中文 文档 当今的Java Web开发技术...Grails建立在这些概念之上,它极大地降低了在Java平台上建立Web应用的复杂性。与那些框架不同的是,Grails是构建在现有的像Spring、Hibernate这样的Java技术之上。
详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发
grails3.2.8 part1
Grails探索之访问存储过程及其事务控制 Grails探索系列 来自IBM