在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的基础概念、MVC架构、持久化、插件系统、视图技术、URL映射、测试策略等多个方面。通过学习和实践,开发者可以充分利用Grails的强大...
"grails ckeditor 0.4修改支持flv插入" 这个标题揭示了我们正在处理一个Grails应用,其中整合了CKEditor 0.4版本,并且已经进行了定制以支持FLV(Flash Video)格式的媒体插入。这表明开发者可能在编辑器中扩展了...
1. **自动化配置和约定优于配置**:Grails 提供了许多默认配置,例如数据库连接、URL映射等,开发者只需按照约定编写代码即可,减少了配置工作。 2. **GORM(Grails Object Relational Mapping)**: GORM 是Grails...
通过GORM(Grails Object Relational Mapping),Grails提供了自动的ORM支持,使得开发者无需编写复杂的SQL语句即可实现数据的持久化操作。 #### Controllers(控制器) 控制器(Controllers)负责处理来自用户的...
其次,Grails的URL映射支持动态段,允许传递参数。如: ```groovy "/book/show/(isbn: String)"(controller: 'book', action: 'show') ``` 这里,`isbn`参数会被自动解析并传递给`BookController`的`show`方法。 ...
- Grails 的URL映射允许开发者定义友好的URL结构,将URL直接映射到控制器和动作,增强用户体验。 8. **Testing** - Grails 提供了全面的测试支持,包括单元测试、集成测试和功能测试,可以方便地对应用的各个部分...
注意,尽管Eclipse对Grails的支持相比IntelliJ IDEA和NetBeans可能稍显不足,但通过Groovy Eclipse插件的配置,开发者依然能在Eclipse中高效地进行Grails开发。不断更新插件和学习最佳实践将有助于提升开发体验。
3. **GORM(Grails Object-Relational Mapping)**:Grails的内置ORM工具,允许开发者以声明式的方式操作数据库,支持SQL的CRUD操作,简化了数据持久化的过程。GORM支持多种数据库,如MySQL、PostgreSQL等。 4. **...
Grails的URL映射机制允许开发者定义友好的、可读性强的URL。`UrlMappings.groovy`文件中定义了这些映射规则,使得路由更加灵活。 七、构建工具和打包机制 Grails使用Gradle作为构建工具,`build.gradle`文件定义了...
- 支持自定义ORM映射,允许更细粒度地控制映射行为。 - 支持缺省排序,简化了查询结果的排序逻辑。 - 支持事务编程,提供了对事务边界和隔离级别的控制。 **GORM与约束** - GORM支持在领域类中定义约束,如唯一性...
同样地,可以通过Eclipse的"Help" -> "Install New Software",添加Grails插件的更新站点(如:http://dist.springsource.org/snapshot/GRails/studio/eclipse/)并完成安装。 3. **配置Grails环境**:安装插件后,...
1. **环境配置**:首先,开发者需要了解如何安装和配置Grails环境,包括Groovy SDK、Grails SDK以及相关的IDE支持,如IntelliJ IDEA或Eclipse的Grails插件。 2. **命令行工具**:Grails提供了强大的命令行工具,...
GORM(Grails对象映射) [Grails] [Grails]是用于使用[Groovy] [Groovy]编程语言构建Web应用程序的框架。 该项目为Hibernate和NoSQL数据存储上的GORM的新实现提供了GORM API管道。 [Grails]: : [Groovy]: : ...
为了在Grails环境中方便地使用SVN,我们需要安装一个支持SVN的客户端插件,这就是Subclipse。本指南将详细介绍如何在Grails环境中安装Subclipse插件。 首先,启动你的Eclipse集成开发环境(IDE),这是Grails通常...
GORM支持动态及静态领域类,通过Grails的映射元数据来定义数据库表和字段。 5. **Grails插件系统** Grails的插件系统是其一大特色,允许开发者共享和复用功能。例如,`spring-security-core`插件用于安全控制,`...
本文将深入探讨如何在Grails项目中集成KindEditor,一个强大的在线富文本编辑器,支持附件上传功能。 KindEditor是一款轻量级、高性能的富文本编辑器,提供多种皮肤和插件,广泛应用于博客、论坛、CMS等系统中。它...
Grails 支持多语言环境,通过i18n资源文件,轻松实现应用的国际化和本地化。 11. **模板引擎与标签库** GSP(Groovy Server Pages)支持自定义标签库,使得视图层逻辑更加清晰,同时提供了内置的标签,如`g:form`...