Liferay7 BPM门户开发之22: Liferay7模型监听器(Model Listeners)
Model Listeners实现ModelListener接口,用于持久化时的AOP处理
一些使用场景:
- Audit Listener: 在一个独立而分离的数据库,做信息更新的审计;
- Cache Clearing Listener: 缓存清除时做的额外定制处理;
- Validation Listener: 实体的验证
- Entity Update Listener: 实体的更新处理
在一个实体模型上可以有多个侦听器,并且无法控制他们运行的顺序。
Liferay7中你只需要处理2件事情,比6.2要简单:
- 1、实现 ModelListener
- 2、在Liferay’s OSGi运行时自动注册服务
在Liferay7中的写法:
- package ...;
- import ...;
- @Component(
- immediate = true,
- service = ModelListener.class
- )
- public class CustomEntityListener extends BaseModelListener<CustomEntity> {
- /* Override one or more methods from the ModelListener
- interface.
- */
- @Override
- public void onAfterCreate(CustomEntity entity) throws ModelListenerException {
- ...
- }
- }
在Liferay7中不用编写docroot/WEB-INF/liferay-hook.xml,增加<portal-properties>portal.properties</portal-properties>,方便很多
在Liferay6中的写法:
- package com.liferay.samples.hooks;
- import com.liferay.portal.ModelListenerException;
- import com.liferay.portal.model.BaseModelListener;
- import com.liferay.portal.model.User;
- public class MyUserListener extends BaseModelListener<User> {
- @Override
- public void onAfterCreate(User user) throws ModelListenerException {
- System.out.println(user.getFullName());
- }
- public void onAfterUpdate(User user) throws ModelListenerException {
- System.out.println(user.getFullName());
- }
- }
CustomEntity用于告诉监听器,实体模型的类型。
注册Liferay’s OSGi runtime:
- @Component(
- immediate = true,
- service = ModelListener.class
- )
可以实现的模型事件:
- onAfterAddAssociation: 处理关联模型的AfterAdd
- onAfterCreate: 在模型的DAO持久化类中Cearte事件之后,做些你的业务逻辑
- onAfterRemove: 在模型的DAO持久化类中Remove事件之后,做些你的业务逻辑
- onAfterRemoveAssociation: 处理关联模型的AfterRemove
- onAfterUpdate: 在模型的DAO持久化类中Update事件之后,做些你的业务逻辑
- onBeforeAddAssociation:
- onBeforeCreate:
- onBeforeRemove:
- onBeforeRemoveAssociation:
- onBeforeUpdate:
如果你熟悉Spring的AOP,是不是有种似曾相识的感觉,这就是Liferay7方式的AOP,好处是可以和之前的旧业务处理代码解耦(你可以做一个新的独立的ModelListener工程)
而不是在DAO持久化类或Service中去添加业务代码。
Hook钩子的其中实现方法之一就是基于Model Listeners
Liferay7 BPM门户开发之22: Liferay7模型监听器(Model Listeners)的更多相关文章
- Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发
hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...
- Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)
在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...
- Liferay7 BPM门户开发之25: Liferay7应用程序配置(APPLICATION CONFIGURATION)
首先有几个概念需要明确.1.第一个概念是这里的应用程序配置不是写XML之类的配置文件,是类似字典的类型化配置这意味着应用程序配置不只是一个字符串键值对的列表.值还可以有类型,如整数列表,字符串列表,一 ...
- Liferay7 BPM门户开发之24: Liferay7应用程序安全
整理中...... Resources, Roles, and PermissionsPortal Access Control List (PACL) Custom SSO Providers Au ...
- Liferay7 BPM门户开发之1:Liferay7开发环境准备
liferay sdk下载 \IDE下载 \ Tomcat 安装细节不在此赘述 网上有很多. 只讲核心关键坑点 进入2016年,从Liferay6.2.5 ga6版本开始,到7.0 ga3,在ivy环 ...
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...
- Liferay7 BPM门户开发之17: Portlet 生命周期
Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...
- Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成
写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...
- Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型
开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...
随机推荐
- elasticsearch 动态增加副本
动态调整副本数 PUT /ptt-new-2018-11/_settings{ "number_of_replicas": 2} 重建索引, 增加节点后要重建索引. 日志报错为网络 ...
- as3.0画直线
import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.Point; var line:Shape; ...
- Loadrunner登录判断
loadrunner判断登录是否成功,以下方法可以解决:1.利用添加检查点web_reg_find函数的方法---------------------------- lr_start_transact ...
- 分布式锁三种实现方式(DB,redis,zookeeper)比较
先贴出看到的一篇博客,后续补充自己总结分析的. https://blog.csdn.net/u010963948/article/details/79006572
- 第三次spring会议
昨天天所做之事: 我用C#用DelectText对行数进行了定义,刚开始写代码有点无从下手. 遇到的问题:刚开始用datagridView进行了文本的输入,但是它更适合EXCEL之类的数据计算不符合我 ...
- HDU 4309 Seikimatsu Occult Tonneru (状压 + 网络流)
题意:输入 n 个城市 m 条边,但是边有三种有向边 a b c d,第一种是 d 是 0,那么就是一条普通的路,可以通过无穷多人,如果 d < 0,那么就是隧道,这个隧道是可以藏 c 个人, ...
- Hibernate 映射及查询
实体类和实体之间的关系:一对多,多对多 数据库设计:e_r 一个实体对象就是一个表格, 如果是1对多的关系,将多方的主键拿到1方做外键. 多对多:重新建立一张新的表格,将双方的主键拿到这里做外键 ...
- 【python接口自动化测试教程】00---00章节就代表开篇吧
今天突然想写个接口测试教程,由于本人是初级的比小白稍微好那么一丢丢,所以不知道能不能坚持下来 写的不对的地方还请大咖指教 先去忙自己的工作了,忙完了回来开始写第一章吧 或者先写个大纲,要不然写的章节会 ...
- 《mysql必知必会》学习_第16章_20180807_欢
第16章:创建高级联结. P106 select concat(RTrim(vend_name),'(',RTrim(vend_country),')') as vend_title from ven ...
- Linux/unix 查看端口占用
有的时候我们想找到某个端口被那个程序.程序占用,然后 kill 掉他,所以今天就来探讨一下. 1.netstat -apn|grep port | 关键字(java/kafka/nginx) 图中所示 ...