Type | Name and description |
---|---|
static Object |
createProxy(Object target, Closure before, Closure after) 创建一个动态代理对象 |
static Object |
deserialize(byte[] so) 将 byte[] 反序列化为对象 |
static boolean |
equals(Object bean1, Object bean2, boolean compareMap = false, List<String> includes = null ) 判断两个Domain实例是否相等。 |
static Class |
findDomainByController(String controllerName) 根据控制器名称获得其对应的DomainClass |
static Object |
getBean(Object name) 获得Spring Bean |
static Closure |
getGroupUniqueValidator(String propertyName, List uniques = null) 用于Domain多属性唯一性校验的校验器 |
static Map |
getPersistentProperties(Class clazz) 获得Domain类的所有可持久化的属性信息,包括名称、类型、是否引用其他Domain类、是否hasMany等 |
static Object |
getProperty(Object obj, String name) 获得对象的属性(含 protected 的属性) |
static boolean |
hasMethod(Object obj, String methodName) 根据名称判断方法是否存在,而不考虑参数的数量、类型等情况 |
static String |
hasProperty(Object obj, Object props, String cacheKey = props.toString() 判断是否有某属性 |
static boolean |
instanceOf(Object bean, Class clazz) 判断对象是否是某个Domain类。 |
static boolean |
isDomain(Object obj) 判断是否为Domain类 |
static Boolean |
isPersistentProperty(Class clazz, String name) 判断Domain类的属性是否是可持久化的 |
static Class |
loadClass(String className) 根据类名,获得类 |
static Class |
parseClass(String script) 根据源码,生成Class |
static Object |
registerBean(String name, Class<?> clazz, Map props, boolean overwrite = false) 注册一个Spring Bean,类似resources.groovy或插件doWithSpring方法中的配置,不过是运行时动态注册。 |
static void |
registerHibernateListner(Object obj, List<String> events, org.hibernate.SessionFactory sessionFactory = null ) 动态注册 Hibernate 事件监听器 |
static void |
registerHibernateListner(Object obj, String event, org.hibernate.SessionFactory sessionFactory = null ) 动态注册 HibernateListner |
static byte[] |
serialize(java.io.Serializable obj) 将对象序列化成 byte[] |
static void |
updateDynamicTable(Object bean, Class hasManyClass, String hasManyName, String belongsToName, Map params, String paramsPrefix, String requiredField, Map callbacks = null) 保存/更新提交的某张动态表的数据。 |
static void |
updateDynamicTables(Object bean, Map params, Map callbacks = null) 自动保存/更新提交的所有动态表的数据。 |
static String |
updateFullNames(Object bean, String nameProp, String fullnameProp, String upperProp, String subsProp, String spliter, boolean hasFirstSpliter, String prefix = null) 根据上下级关系,更新全名(如fullName,包括下级节点),每级之间以spliter分隔 |
static String |
updateFullSequences(Object bean, String seqProp, String fullseqProp, String upperProp, String subsProp, Integer maxLevel = 10) 根据本级内排序号,更新全局序号 |
static String |
updateFullSortorders(Object bean, String seqProp, String fullseqProp, String upperProp, String subsProp, Integer maxLevel = 10) |
static Number |
updateLevels(Object bean, String levelProp, String upperProp, String subsProp, Number start = 1 ) 根据上下级关系,更新级别(如level,包括下级节点) |
Methods inherited from class | Name |
---|---|
class Object |
Object#wait(long), Object#wait(long, int), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
创建一个动态代理对象
可以用来计算方法执行时间、覆盖原对象或者类的方法等功能。
例如:createProxy(object, {m,p-> println m}, {m,p,r -> println r})
如果都是groovy类,更简单的还可以参考 http://groovy.codehaus.org/ExpandoMetaClass+-+Runtime+Discovery 中的方式来覆盖类或者对象的方法。 此外,由于Groovy、Grails本身有大量动态方法,因此可能调用代理对象的方法时,可能会抛出 MissingMethodException 的异常。
before 包含参数String
- methodName, Object[] args
的闭包,在执行原对象方法前被调用,如果返回 false,则中断执行after 包含参数String
- methodName, Object[] args, Object result
的闭包,在执行原对象方法后被调用,参数 result 为原方法的返回结果将 byte[] 反序列化为对象
判断两个Domain实例是否相等。
作为默认的equals方法,自动或由注解 bropen.toolkit.transform.DomainEquals 注入到Domain类中。 可解决延迟加载后,bean的类名自动加上后缀"_$$...."问题。
compareMap
- 是否允许和Map进行比较,默认为否includes
- 参与equals计算的属性名列表,默认为 id根据控制器名称获得其对应的DomainClass
获得Spring Bean
name
- Spring中注册的名称/或者Class用于Domain多属性唯一性校验的校验器
示例:
name( nullable:false, blank:false, unique:['code', 'measure'],
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name') )
示例2:
name( nullable:false, blank:false,
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name',['code', 'measure']) )
uniques
- 需要关联的唯一属性集合,想使用父类中的字段作为唯一属性时,可以使用此参数,用法参考示例2 ,默认nullpropertyName
- 配置校验器的属性名称,通过它可以获得关联的唯一属性获得Domain类的所有可持久化的属性信息,包括名称、类型、是否引用其他Domain类、是否hasMany等
[name:x, type:x(可能是Set、List), reftype:x, isDomain:true/false, hasMany:true/false, unique: true/false]
获得对象的属性(含 protected 的属性)
根据名称判断方法是否存在,而不考虑参数的数量、类型等情况
obj
- 对象实例,或者类methodName
- 方法名称判断是否有某属性
obj
- 对象实例,或者类props
- 属性名称或属性名称列表cacheKey
- 缓存的key,针对同一种属性检查做缓存,以提升性能。默认等于 props.toString()判断对象是否是某个Domain类。主要是解决延迟加载后,bean的类名自动加上后缀"_$$...."问题。
判断是否为Domain类
obj
- 如果是Class,则判断类是不是领域类;如果是对象,则判断对象的类;如果是列表或数组,则判断其中的第一个元素是否是领域类。判断Domain类的属性是否是可持久化的
clazz
- Domain类name
- 属性名根据类名,获得类
根据源码,生成Class
script
- 源代码注册一个Spring Bean,类似resources.groovy或插件doWithSpring方法中的配置,不过是运行时动态注册。
注:Spring Bean原本有多种作用域,如singleton、prototype(即non-singleton)等等,这里仅注册常用的单例Bean。
name
- Bean的名称clazz
- Bean的类props
- 初始化时需要注入的参数Map(类里需要实现对应的setXxxx方法);null则表示无需注入其他参数overwrite
- 如果Bean已存在,是否覆盖,默认为否(等同于getBean)动态注册 Hibernate 事件监听器
obj
- 监听类或监听类实例events
- 需要监听的事件列表sessionFactory
- 如果为空,则注册到所有数据源上。 在调用方,可以通过: DbUtils.getSessionFactory 获得sessionFactory,或者直接依赖注入。
动态注册 HibernateListner
obj
- 监听类或监听类实例event
- 需要监听的事件将对象序列化成 byte[]
保存/更新提交的某张动态表的数据。配合Web端js工具类“DynamicTable”。
hasManyClass
- 明细项的Domain ClasshasManyName
- 容器的列表属性名称(hasMany)belongsToName
- 明细项对应容器的属性名称(belongsTo),如果为null,则可能是采用中间表关联的、松耦合的hasMany关系params
- 控制器里的params。 如果 params[prefix].preserved 有值(以分号或逗号分隔的多个ID字符串),且提交的数据里不包含这些数据,则不会自动删除; 如果 params[prefix+"DynamicTable"] 为空,则什么都不做,前台使用js api初始化动态表格时,会自动提交该值; 如果 params[prefix] 为空,会删除所有数据。
paramsPrefix
- 参数前缀,如 mxAnzhuangItem、item 等,注意不能为下划线开头(如_item),并且建议不要和 hasManyName 一致,以免调用bean.properties=params时把值全部冲掉requiredField
- 必填项的名称,如 name,如果值为空,则会这条数据不会被保存自动保存/更新提交的所有动态表的数据。配合Web端js工具类“DynamicTable”。
params
- 提交的数据,一般就是控制器里的paramscallbacks.delete
- 回调方法 {item-> XXXX},如果方法返回false,则不删除。本参数可以直接传一个false值,相当于一个返回false的方法callbacks.save
- 回调方法 {item-> XXXX}callbacks.update
- 回调方法 {item, Map oldProps=null -> XXXX},如果不许要知道原始的属性,则该闭包无需参数2,以提高性能callbacks.bind
- 回调方法 {key, value -> return value2},用于转换前台提交过来的数据,如果返回null,则表示不处理(自动bind)根据上下级关系,更新全名(如fullName,包括下级节点),每级之间以spliter分隔
bean
- 需要更新的实体nameProp
- 名称属性名,如namefullnameProp
- 全名属性名,如fullNameupperProp
- 上级bean的属性名称,如uppersubsProp
- 下级bean的属性名称,如subsspliter
- 分隔符,如 /hasFirstSpliter
- 如果没有上级节点,是否以分隔符作为开始字符prefix
- 全名前缀根据本级内排序号,更新全局序号
bean
- 需要更新的实体seqProp
- 序号属性名称,如sequence,必须为 1~999fullseqProp
- 全局序号属性名称,如fullSequenceupperProp
- 上级bean的属性名称,如uppersubsProp
- 下级bean的属性名称,如subs,如果为空,则不更新下级节点maxLevel
- 最大的级别(级别越高,全局序号越长),默认为10级根据上下级关系,更新级别(如level,包括下级节点)
bean
- 需要更新的实体levelProp
- 级别属性名,如 levelupperProp
- 上级bean的属性名称,如uppersubsProp
- 下级bean的属性名称,如subsstart
- 根节点的级别,默认为 1