`

论Grails----转载

阅读更多
最近用Grails 0.3.1/0.4写了一个小应用耍耍,主要想感受一下grails的快速开发能力,顺便尝尝Grooy的语法糖。

刚开始的几天,写了一个简单的模块,只有几个domain class和几个controller,也没有写test case,Grails 还在0.3.1,使用下来觉得Grails非常爽,尤其是Groovy的语法糖,那些closure, each操作,简直是爽坏了。

过了几天,业务开始复杂起来,需要整合acegi了,于是碰到了第一个问题,pojo service和POGO service/domain 互操作的问题。

再过了几天,grails升级到0.4了,业务也更加复杂了,添加了几个自己的POGO service. 用户,角色,权限,自定义的acege voter...多对多关系终于出现了,单元测试不得不写了。。。于是感觉到用Grails开发的问题越来越严重了。。。

下面是我碰到的问题列表,由于我是初次使用GRails,如果有谁发现其中的错误请不吝指出,谢谢!

(1) POJO service / Grails service 互相操作不方便.假如我在某个java service中需要注入一个Groovy写的service,那么,这个Service Type究竟该是什么? 按照[http://www.grails.org/Services 官方的doc],需要我们定义一个java interface, 然后让POGO的Service来implements该接口,然后就可以通过request.getSession().getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT).getBean(...)来获得POGO Service.

看起来挺不错的,仔细一想,该操作根本必须让POJO Service自行resolve需要的POGO Service dependency, 这不是忽悠人么.还算啥IoC啊. 还有,在POJO里面通常不大可能有request对象哈? 实现ContextAware? 不管用! 嘿嘿一般人我可不告诉他啊,您必须得让POJO Service继承WebApplicationObjectSupport,才能获得servletContext...然后获得该bean.估计是POGO Service的Scope有问题,或者可能和POJO Bean不在同一个level. 于是一番折腾下来,我们的POJO变得面目全非,人不人鬼不鬼咯.

有一个现成的例子是Grails与Acegi的整合,我们必须提供一个GrailsUserDetailService实现,这是一个Pojo Service. Acegi需要调用该Service来获得ACEGI中UserDetails的信息,同时该Pojo Service需要通过操作grails domain object, 比如User.findByUsername()来lookup domain classes,于是里面就有很多有趣的代码了,比如invokeMethod('foo','args)....

(2) Grails run-app/test-app 启动非常慢, 在P1.9M的laptop上面从输入命令到可以运行,至少30s. 这是很严重的问题,我们严重依赖TestCase来保证代码的行为,为了调试代码中的问题,必须不停的跑测试,调试,再跑测试. JUnit跑一次通常< 5s,而这里每次run testcase都需要30s,这是无法忍受的. 这篇doc就是在grails test-app的等待间歇中写出来的...

(3) Domain Class Validation的不足.据一个简单的场景创建用户.输入数据验证除了简单的字串长度检测外, 还有一个额外需求, 界面需要用户2次输入密码并且一致后,才能创建用户. 这个场景需要同时提供Form端的验证和DomainClass端的验证,而password confirm验证必须在Form端完成.由于目前Grials仅支持在domain class上的验证,所以我们只能在controller里面用类似的代码来验证:
{{{
#!python
//FIXME we need do validation against the form data instead of the domain class
  if(!params.password.equals(params.password_confirm)){
    flash['error'] = "The password must match"
    return params
  }
}}}

(4) Grails0.4 不支持domain/controller里面的subfolder,这也是很必要的一个功能, 试想写Java代码但是不能用package,所有类都在一个目录里...受不了

(5) Plugin机制还不够完善,灵活性不够,反而大大降低了系统性能. Domain class无法在APP中使用, gsp文件无法在app中被正确load...

(6) GORM mapping有限制,复杂应用还是得靠手动些Java Class/Annotation/Mapping file来完成.如果domain class变成pojo,由于这些entity是由Hibernate创建的,dependency injection就成了问题这些东西就变成了Entity,至少不再是rich domain object咯.另外,问题(1)也会随之而来.

(7) 映射关系复杂到一定程度, 在save entity object graph的时候,就会碰到Hibernate中著名的jdbc batch execution exception问题.而我们无法在Service中处理tx,session. 新增加的withTransaction{} closure也只是给你一个spring transactionManager,你只能savePoint() or setRollbackOnly()而无法操控整个TX
以下代码是一POGO Service Test Case,其中创建一系列POGO,save,然后再调用userService load entity.我们需要用一个Session来创建并save这些POGO,然后另开一个Session来load这些POGO进行验证.但似乎testcase缺省的用了OpenSessionInView pattern,从头到尾只有一个Session.... 哪怕让我session.evict()也好啊....

(8) Domain class 的delete() 方法永远返回null,所以无法判断删除操作是否成功

----
2007-02-06 继续批判

(9) Reload机制太弱.只有在controller/view上的代码改动,才可以reload. 如果Domain class被改动了,会报Unable to re-create configuration for reloaded class 500 错误. 同样修改过的transactional sevice也不能reload. [[br]] 按照grails doc的说法,
{{{
Domain classes are core to any business application. They hold state about business processes and hopefully also implement behavior.
}}}
{{{
A service is a class that holds one or more methods that implement business logic. Logical parts of the business logic are contained in separate service classes. Services are demarcated by transactions to make units of work atomic on the persistence level. When certain types of exceptions are thrown transactions are rolled back.
}}}
毫无疑问,domain和service中将含有绝大部分的业务逻辑代码,而你现在稍微一改动代码就要重新运行grails run-app,运行一次就是几十秒. 对有过TDD经历人,这种等待绝对是折磨!
分享到:
评论

相关推荐

    grails-fck-editor-0.3.zip_grails_grails-fck-editor

    标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-editor"表明这是一个与Grails框架相关的插件,具体来说是FCKeditor的一个版本。FCKeditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上创建和编辑...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。

    grails-doc-CN-1.0.rar

    `grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要深入了解 Grails 的中文用户来说,这是一个极其宝贵的资源。 文档主要涵盖以下几个关键知识点: 1. **...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...

    Groovy&Grails - 指南.ppt

    在 `grails-app/domain` 创建 `User.groovy` 文件定义用户类,然后在 `grails-app/controllers/UserController.groovy` 编写控制器,处理用户的注册、登录等操作。在 `grails-app/views/user` 下创建相应的 GSP 页面...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    总之,"grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip"提供了一个宝贵的资源,让开发者有机会学习和实践Grails的ORM功能和Android的MVC设计模式。无论是对Grails框架的探索,还是对Android开发的深化,这...

    grails-core源码

    在解压后的`grails-core-master`目录中,我们可以看到Grails的核心模块组织结构。通常,一个开源项目的源码结构反映了它的设计思路和功能划分。`src/main/groovy`包含了主要的源代码,`src/test/groovy`用于存放测试...

    grails-quartz-0.4.1

    在`Grails` 中,`Grails-Quartz` 插件提供了集成`Quartz` 的能力,使得开发者可以在`Grails` 应用中方便地安排和执行周期性任务。 **1. QuartzGrailsPlugin.groovy** 这个文件是`Grails` 插件的核心配置文件,其中...

    grails-2.3.6.zip

    Grails是一种基于Groovy语言的开源Web应用框架,它构建在Spring Boot之上,旨在提高开发者的生产力和灵活性。Grails 2.3.6是该框架的一个特定版本,发布于2014年,提供了许多改进和新特性,旨在优化开发流程。 1. *...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    本文将深入探讨Grails的中文文档以及“grails-fckeditor-0.9.5”插件的相关知识点。 一、Grails框架基础 1. Groovy语言:Grails的基础是Groovy,这是一种面向对象、动态类型的编程语言,语法简洁且与Java高度兼容...

    grails-2.5.6

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...

    grails-web-url-mappings-2.5.4.zip

    这个名为"grails-web-url-mappings-2.5.4.zip"的压缩包包含了Grails 2.5.4版本中的Web URL映射相关代码,让我们深入探讨这一关键组件。 Grails是一个基于Groovy语言的全栈式Java web框架,其设计理念是“简洁、生产...

    grails-4.0.3.rar

    Grails 4 ships with the following dependency upgrades: Groovy 2.5.6 GORM 7 and Hibernate 5.4 (now the default version of Hibernate for new applications) Spring Framework 5.1.5 Spring Boot 2.1.3 ...

    grails-docs-2.0.0

    `grails-docs-2.0.0`是Grails 2.0.0版本的官方文档,包含了丰富的指南、API参考以及国际化资源,对于学习和掌握Grails 2.0.0至关重要。 首先,`index.html`是文档的主页,通常会包含目录、介绍性内容以及如何开始的...

    Grails-2.4.4-用户手册

    2. **创建新项目**:通过`grails create-app`命令创建项目,理解`grails-app`目录结构。 3. **编写Domain Class**:学习如何定义领域类,包括关系映射和验证规则。 4. **创建Controller**:了解如何创建控制器,处理...

    grails-docs-1.0

    《Grails框架API文档详解——基于grails-docs-1.0》 Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API...

    grails-acegi-0.5.zip

    4. `docs`、`grails-app`、`src`、`scripts`和`lib`目录则分别包含了插件的文档、应用代码、源代码、脚本以及依赖的库文件。 Grails Acegi 0.5插件提供了以下主要功能: - **用户认证**:支持多种认证机制,如...

    grails-spring-websocket

    grails-spring-websocket ils子 2.4.x 3.2.7+ 2.5.x 4.0.0+ 安装 要将插件安装到Grails应用程序中,请将以下行添加到build.gradle依赖项部分: implementation "org.grails.plugins:grails-spring-websocket:...

    grails-acegi-0.2.1.zip

    本文将详细探讨“grails-acegi-0.2.1.zip”这个插件,它是Grails框架中用于实现权限管理的Spring插件的一个早期版本。 Acegi Security是Spring框架的一个扩展,它提供了一套全面的、灵活的安全性解决方案。在Grails...

Global site tag (gtag.js) - Google Analytics