Grails1.3.x至1.4.0(2.0)升级实践

 

这几天把一个Grails做的Web应用从1.3.7升级到1.4.0(目前还是M1),有很多兼容性问题,应用几乎都跑不起来,怪不得官方已经准备把1.4.0改成2.0发布。但幸运的是应用比较简单,问题并不多,也不很严重,可以通过修改少量代码来移植,下面讲述我遇到的问题以及解决过程,希望对准备升级的程序员有一些参考价值。主要有以下几项:

 

 

1. 自定义的js文件无法导入使用,且在IDE中修改js文件Web服务器不会自动加载(reload)

自定义的js原来用<g:javascript library="xxxxx"/>方式导入的,现在已经无效了,改为以下方式导入:

<g:javascript src="xxxxxx.js"/>

 或者使用Resources插件对js资源进行管理:

<r:external dir="js" file="xxxxx.js"/>
 

刷新页面,可以看到生成了<appname>/static/js/xxxxx.js,而不是原来的<appname> /js/xxxxx.js,而对<appname>?js/xxxxx.js的访问会自动重定向到static的资源上,这是Resource插件在起作用,此时的js文件(当然也包括其他资源,如CSS, images)作为了静态资源,任何对js文件的改动都不会对运行时的Web服务器生效。为了便于开发调试,需要在 Config.grovvy中加入设置

grails.resources.debug = true

 重启服务器后再修改js的内容时,服务器会自动reload资源。此时观察生成的代码,变成了

<appname>/js/xxxxx.js?_debugResources=y&n=1310271245143
 

 

 

2. formRemote标签(所有Ajax风格的标签)渲染报错

 

我使用了formRemote之类的标签无刷新提交表单,该标签会生成Ajax风格的HTML form,1.3.7之前的版本默认使用prototype作为Ajax工具,而1.4.0使用jQuery。升级后渲染页面会产生如下错误信息:

 

No javascript provider is configured at ......
 

这是因为默认的javascript框架从prototype改为jQuery,导致一些标签和JS功能无法正常使用。

首先需要安装jQuery插件和Resources插件(安装方法不赘述),然后在GSP页面中加入如下代码,显式设置JS框架为jQuery,

 

 

<g:setProvider library="jquery"/>

 

在layout/main.gsp中按照下面方式加入<r:layoutResource/>标签:

 

<head>
  <g:layoutHead />
  <r:layoutResources/>
</head>

 

此时刷新页面,查看网页代码可以发现已经生成了基于jQuery的代码。

 


3. 默认的开发数据库从HSQL改为H2。

因为之前我就把测试数据库改为了H2,因此在这个上面没有出现任何兼容性问题。不过H2确实是值得推荐的内存数据库,体积很小,但是功能齐全,开箱即用,与HSQL完全相同的工作模式和使用方法,配置方式都是一样的,但是比HSQL更加稳定(至少我是这么认为的,HSQL我无法开箱即用,我只是要做测试而已),功能更多。更为有趣的是,它自带了一个Web版本管理查询界面,用起来也很顺手。

 

 

4. createLinkTo(url="/")标签使用出错。

createLinkTo标签在1.4中被废弃,文档建议改用resource,而实际情况应该使用createLink标签,将代码改为createLink(uri:'/')即可。

 

 

5. 在Controller内定义的方法 def foo() 调用报错

错误信息为:

groovy.lang.MissingMethodException: No signature of method: xxx.yyy.foo() is applicable for argument types: (java.lang.String) values: [XXXXXX]
 

把方法定义def foo()改为 protected foo() 形式的定义即可。这个有点奇怪,是因为闭包的问题?还是def定义的可访问性原因?反正我没搞清楚,不想太深究。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值