`
geszJava
  • 浏览: 33940 次
社区版块
存档分类
最新评论

给grails添加text映射支持

阅读更多
在grails中,domain class的String字段总是被映射成varchar,当然可以自己写xml映射文件解决这个问题,不过没有一劳永逸的解决方法了吗?于是开始搜索grails的论坛,发现这个特性还没有实现,开发人员倒是给出了一个issue:在constraints中实现type约束: propertyname(type:"text"),很郁闷了,还是自己来修改一下grails的源代码吧.
由于要在constraints中添加type约束,那么需要实现一个可以识别type的约束类,如下(在org.codehaus.groovy.grails.validation.ConstrainedProperty中):
先添加一个约束类字符串的声明, 反正他也不会用在validate,就在校验处理的时候什么也不作好了:
public static final String MAPPING_TYPE_CONSTRAINT = "type";
记得把这个类添加到map中
constraints.put(MAPPING_TYPE_CONSTRAINT, MappingTypeConstraint.class);

static class MappingTypeConstraint extends AbstractConstraint {
private String mapping_type;

public boolean supports(Class type) {
if (type == null)
return false;
return String.class.isAssignableFrom(type);
}

/*
* (non-Javadoc)
*
* @see org.codehaus.groovy.grails.validation.ConstrainedProperty.AbstractConstraint#setParameter(java.lang.Object)
*/
public void setParameter(Object constraintParameter) {
if (!(constraintParameter instanceof Comparable))
throw new IllegalArgumentException(
"Parameter for constraint ["
+ MAPPING_TYPE_CONSTRAINT
+ "] of property ["
+ constraintPropertyName
+ "] of class ["
+ constraintOwningClass
+ "] must implement the interface [java.lang.Comparable]");

this.mapping_type = (String) constraintParameter;
super.setParameter(constraintParameter);
}

public String getType() {
return this.mapping_type;
}

public String getName() {
return MAPPING_TYPE_CONSTRAINT;
}

protected void processValidate(Object target, Object propertyValue,
Errors errors) {
}
}

还要添加两个方法:
public Comparable getType() {
MappingTypeConstraint c = (MappingTypeConstraint) this.appliedConstraints
.get(MAPPING_TYPE_CONSTRAINT);
if (c == null) {
Range r = getRange();
if (r == null) {
return null;
} else {
return r.getFrom();
}
}
return c.getType();
}

public void setType(String type) {
if (!String.class.isInstance(propertyType)) {
throw new MissingPropertyException(
"Mapping type constraint can only be applied to a String property",
MAPPING_TYPE_CONSTRAINT, owningClass);
}

Constraint c = (Constraint) this.appliedConstraints
.get(MAPPING_TYPE_CONSTRAINT);
if (type == null) {
this.appliedConstraints.remove(MAPPING_TYPE_CONSTRAINT);
} else {
if (c != null) {
c.setParameter(type);
} else {
c = new MatchesConstraint();
c.setOwningClass(this.owningClass);
c.setPropertyName(this.propertyName);
c.setParameter(type);
this.appliedConstraints.put(MAPPING_TYPE_CONSTRAINT, c);
}
}
}
再添加个方法,偷懒点,只考虑"text"这种映射, 实际上我也只需要"text"映射:
public boolean hasMapTypeConstraints() {
return appliedConstraints.containsKey(MAPPING_TYPE_CONSTRAINT);
}
好了,前期准备工作基本上做好了,
然后去org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder
修改一下bindSimpleValue方法就ok了:

private static void bindSimpleValue(GrailsDomainClassProperty grailsProp, SimpleValue simpleValue,Mappings mappings) {
// set type

simpleValue.setTypeName(grailsProp.getType().getName());

//添加text映射支持
Map cs = (Map)grailsProp.getDomainClass().getConstrainedProperties();
if (cs != null) {
ConstrainedProperty cp = (ConstrainedProperty)cs.get(grailsProp.getName());
if (cp != null && cp.hasMapTypeConstraints()) {
simpleValue.setTypeName(Hibernate.TEXT.getName());

System.out.println("TEXT Mapping: for =>" + grailsProp.getName());
}

}


Table table = simpleValue.getTable();
Column column = new Column();
if(grailsProp.isManyToOne())
column.setNullable(false);

column.setValue(simpleValue);
bindColumn(grailsProp, column);

if(table != null) table.addColumn(column);

simpleValue.addColumn(column);
}

ok,重新打包放到grails的dist目录下面,这样我们就可以在grails的domainclass中使用这样的约束:
def constraints = {
content(length:10..20000,blank:false, type:"text")
}
于是content的类型就映射到了Hibernate.Text上面去了.而不是原先的varchar
分享到:
评论

相关推荐

    grails中文入门简介

    最后,Grails社区还提供了丰富的插件库,这些插件可以扩展Grails的功能,例如添加缓存支持、邮件服务或者其他定制化功能。开发者可以很方便地在Grails项目中集成这些插件来增强应用程序的能力。 Grails框架的中文...

    grails-用户手册

    总结来说,《Grails用户手册》涵盖了从项目创建到部署运行的全过程,包括Grails的基础概念、MVC架构、持久化、插件系统、视图技术、URL映射、测试策略等多个方面。通过学习和实践,开发者可以充分利用Grails的强大...

    grails ckeditor 0.4修改支持flv插入

    "grails ckeditor 0.4修改支持flv插入" 这个标题揭示了我们正在处理一个Grails应用,其中整合了CKEditor 0.4版本,并且已经进行了定制以支持FLV(Flash Video)格式的媒体插入。这表明开发者可能在编辑器中扩展了...

    Grails Grails Grails

    1. **自动化配置和约定优于配置**:Grails 提供了许多默认配置,例如数据库连接、URL映射等,开发者只需按照约定编写代码即可,减少了配置工作。 2. **GORM(Grails Object Relational Mapping)**: GORM 是Grails...

    the definitive guide to grails 2

    通过GORM(Grails Object Relational Mapping),Grails提供了自动的ORM支持,使得开发者无需编写复杂的SQL语句即可实现数据的持久化操作。 #### Controllers(控制器) 控制器(Controllers)负责处理来自用户的...

    grails-web-url-mappings-2.5.4.zip

    其次,Grails的URL映射支持动态段,允许传递参数。如: ```groovy "/book/show/(isbn: String)"(controller: 'book', action: 'show') ``` 这里,`isbn`参数会被自动解析并传递给`BookController`的`show`方法。 ...

    grails 中文手册

    - Grails 的URL映射允许开发者定义友好的URL结构,将URL直接映射到控制器和动作,增强用户体验。 8. **Testing** - Grails 提供了全面的测试支持,包括单元测试、集成测试和功能测试,可以方便地对应用的各个部分...

    Eclipse下搭建Grails项目

    注意,尽管Eclipse对Grails的支持相比IntelliJ IDEA和NetBeans可能稍显不足,但通过Groovy Eclipse插件的配置,开发者依然能在Eclipse中高效地进行Grails开发。不断更新插件和学习最佳实践将有助于提升开发体验。

    Grails权威指南 Grails权威指南

    3. **GORM(Grails Object-Relational Mapping)**:Grails的内置ORM工具,允许开发者以声明式的方式操作数据库,支持SQL的CRUD操作,简化了数据持久化的过程。GORM支持多种数据库,如MySQL、PostgreSQL等。 4. **...

    grails-core源码

    Grails的URL映射机制允许开发者定义友好的、可读性强的URL。`UrlMappings.groovy`文件中定义了这些映射规则,使得路由更加灵活。 七、构建工具和打包机制 Grails使用Gradle作为构建工具,`build.gradle`文件定义了...

    grails 中文第二版

    - 支持自定义ORM映射,允许更细粒度地控制映射行为。 - 支持缺省排序,简化了查询结果的排序逻辑。 - 支持事务编程,提供了对事务边界和隔离级别的控制。 **GORM与约束** - GORM支持在领域类中定义约束,如唯一性...

    eclipse开发grails插件

    同样地,可以通过Eclipse的"Help" -> "Install New Software",添加Grails插件的更新站点(如:http://dist.springsource.org/snapshot/GRails/studio/eclipse/)并完成安装。 3. **配置Grails环境**:安装插件后,...

    Grails1.1中文文档

    1. **环境配置**:首先,开发者需要了解如何安装和配置Grails环境,包括Groovy SDK、Grails SDK以及相关的IDE支持,如IntelliJ IDEA或Eclipse的Grails插件。 2. **命令行工具**:Grails提供了强大的命令行工具,...

    grails-data-mapping:GORM-Groovy对象映射

    GORM(Grails对象映射) [Grails] [Grails]是用于使用[Groovy] [Groovy]编程语言构建Web应用程序的框架。 该项目为Hibernate和NoSQL数据存储上的GORM的新实现提供了GORM API管道。 [Grails]: : [Groovy]: : ...

    Grails安装SVN客户端插件指导手册

    为了在Grails环境中方便地使用SVN,我们需要安装一个支持SVN的客户端插件,这就是Subclipse。本指南将详细介绍如何在Grails环境中安装Subclipse插件。 首先,启动你的Eclipse集成开发环境(IDE),这是Grails通常...

    grails开发

    GORM支持动态及静态领域类,通过Grails的映射元数据来定义数据库表和字段。 5. **Grails插件系统** Grails的插件系统是其一大特色,允许开发者共享和复用功能。例如,`spring-security-core`插件用于安全控制,`...

    Grails使用kindeditor,支持附件

    本文将深入探讨如何在Grails项目中集成KindEditor,一个强大的在线富文本编辑器,支持附件上传功能。 KindEditor是一款轻量级、高性能的富文本编辑器,提供多种皮肤和插件,广泛应用于博客、论坛、CMS等系统中。它...

    grails 文档

    Grails 支持多语言环境,通过i18n资源文件,轻松实现应用的国际化和本地化。 11. **模板引擎与标签库** GSP(Groovy Server Pages)支持自定义标签库,使得视图层逻辑更加清晰,同时提供了内置的标签,如`g:form`...

Global site tag (gtag.js) - Google Analytics