Grails编码不当导致插件错误 GrailsGroovyJavaJVMSpring
程序员文章站
2024-02-28 08:28:58
...
Grails有那么多的插件,用起来很方便。
最近用了mail plugin,测试发送邮件都正常了,正好要睡觉了,最后看看代码都放controller里面太臭了,加了个MailService,也没测,就提交了,睡觉。
第二天,再跑服务,报错。
java.lang.*Error at sun.reflect.GeneratedMethodAccessor307.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88) at org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:80) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:307) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:63) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124) at MailGrailsPlugin$_configureSendMail_closure7.doCall(MailGrailsPlugin.groovy:154)
对Grails底层研究不够,尝试了N种办法均未果,不得不新建工程,一步步测,突然想起来那个MailService,原工程改了名字后,就正常了。
其实原因很简单,Grails底层是Spring,mail plugin也有个MailService,会在任何调用sendMail方法的controller里面注入名为mailService的服务,而我的Service和它冲突了。
1、如何避免这种冲突呢?如果插件用的越多,那么重名的可能性会更大了。曾经碰到过一个这样的例子,有个朋友配置aop事务的时候,用了pointcut="execution(* com..*Manager.*(..))",结果也是和引用的jar包里面冲突了。不知道这种问题如何去解决和避免。
2、Grails错误日志还有待提高,难怪Matt Raible在他的《COMPARING JVM WEB FRAMEWORKS》中评价有一句Stack traces are horrendous。
参考资料
- Grails Mail Plugin
http://www.grails.org/plugin/mail
- My Comparing JVM Web Frameworks Presentation from Devoxx 2010(Matt Raible November 18, 2010)
http://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks