(后台)Openbravo如何实现业务事件监听处理
1. 介绍
业务事件允许你进行一些逻辑处理,在一个对象进行保存,修改或者删除的时候。就像数据库里面的触发器一样,但是它的优点是,你可以通过java代码来实现你想要的功能,方便调试与实现。比如你想在生成销售订单的时候自动生成一个单据号,可以利用业务事件来处理。具体参考如下这个类:SetDocumentNoHandler
2. 简单示例
我们先来一个简单示例,如下代码所示:
public class GreetingEventHandler extends EntityPersistenceEventObserver {private static Entity[] entities = { ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME) };protected Logger logger = Logger.getLogger(this.getClass());@Overrideprotected Entity[] getObservedEntities() {return entities;}public void onUpdate(@Observes EntityUpdateEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + event.getTargetInstance().getId() + " is being updated");}public void onSave(@Observes EntityNewEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + ((Greeting) event.getTargetInstance()).getName()+ " is being created");}public void onDelete(@Observes EntityDeleteEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + event.getTargetInstance().getId() + " is being deleted");}
}
需要注意如下几点:
1. 继承于EntityPersistenceEventObserver 类,帮助过滤出正确的事件(因为所有的保存,修改,删除事件都会发送过来,我们需要刷新出自己感兴趣的事件)
2. 方法名不重要,比如里面的onDelete方法,主要的是那个参数的声明@Observes EntityDeleteEvent event, Weld框架利用这个参数声明来判定哪些事件应该发送给这个方法。
3. 任何一个实体更新,保存,修改都会发送事件到这个eventHandler的对应方法,每一个方法头部,都需要通过方法isValidEvent事件来判断这个事件是否为自己感兴趣的。
4. 我们通过org.apache.log4j.Logger类来记录日志。
3. 简单展示
当你将这个类加入你的模块,重启tomcat的时候,进入称呼这个窗口:http://localhost:8080/openbravo/?tabId=282你将在控制台看到你记录的日志。
4. 更复杂一点示例
假如我们要在更新的时候判断title字段是否有一点,如果没有,在末尾加上一点。在保存的时候,增加一个子表翻译。如下代码所示:
public void onUpdate(@Observes
EntityUpdateEvent event) {
if (!isValidEvent(event)) {
return;
}
final Greeting greeting = (Greeting) event.getTargetInstance();
final String title = greeting.getTitle();
if (title != null && !title.endsWith(".")) {
final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);
final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
// note use setCurrentState and not setters on the Greeting object directly
event.setCurrentState(greetingTitleProperty, title + ".");
}
System.err.println("Greeting " + event.getTargetInstance().getId() + " is being updated");
}
public void onSave(@Observes
EntityNewEvent event) {
if (!isValidEvent(event)) {
return;
}
final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);
final Greeting greeting = (Greeting) event.getTargetInstance();
// now also add the dot to the title
final String title = greeting.getTitle();
if (title != null && !title.endsWith(".")) {
final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
// note use setCurrentState and not setters on the Greeting object directly
event.setCurrentState(greetingTitleProperty, title + ".");
}
final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);
// set relevant translation properties
greetingTrl.setGreeting(greeting);
// 171 is dutch, choose any other language..
greetingTrl.setLanguage(OBDal.getInstance().get(Language.class, "171"));
// note we can call getters on the targetInstance, but not setters!
greetingTrl.setName(greeting.getName());
greetingTrl.setTitle(greeting.getTitle());
greetingTrl.setTranslation(false);
// and add the greetingTrl to the greeting
// we don't use event.setCurrentState as we get the list and add to it
// get the trl property for the greeting entity
final Property greetingTrlProperty = greetingEntity
.getProperty(Greeting.PROPERTY_GREETINGTRLLIST);
@SuppressWarnings("unchecked")
final List<Object> greetingTrls = (List<Object>) event.getCurrentState(greetingTrlProperty);
greetingTrls.add(greetingTrl);
// don't need to save the greetingTrl, it is saved as the child of the greeting
// OBDal.getInstance().save(greetingTrl);
System.err.println("Greeting " + ((Greeting) event.getTargetInstance()).getName()
+ " is being created");
}
这里需要注意几点:
1. 获取字段名通过新建一个空实体,如下代码所示
final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
2. 修改一个保存前实体某一个字段的值,不能用set方法,必须如下所示:
event.setCurrentState(greetingTitleProperty, title + ".");
3. 新建一个需要持久化的实体,不能用new关键字,必须如下所示:
final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);
4. 新建的子实体不需要自己调用代码进行持久化,会随着主实体持久化而持久化。
5. 中断处理
假如我们想在保存前,判断一些条件,如果不满足,中断保存过程,我们可以抛出异常,如下代码所示:
public void onUpdate(@ObservesEntityUpdateEvent event) {if (!isValidEvent(event)) {return;}final OBSA_Orderline_Assign olineAssign = (OBSA_Orderline_Assign) event.getTargetInstance();if (olineAssign.getProductWithStorage().getProduct() != olineAssign.getSalesOrderLine().getProduct()) {String language = OBContext.getOBContext().getLanguage().getLanguage();ConnectionProvider conn = new DalConnectionProvider(false);throw new OBException(Utility.messageBD(conn, "OBSA_ErrorProduct", language));}}
(后台)Openbravo如何实现业务事件监听处理相关推荐
- 如何实现业务解耦?spring中事件监听了解一下
一.前言 二.业务解耦之事件监听实战 1.事件监听三大组件 2.事件发布以及监听实战案例 3.事件发布以及监听原理 一.前言 耦合这个词在平常的开发 ...
- 13、Java Swing事件监听:事件处理模型和事件监听器
事件表示程序和用户之间的交互,例如在文本框中输入,在列表框或组合框中选择,选中复选框和单选框,单击按钮等.事件处理表示程序对事件的响应,对用户的交互或者说对事件的处理是事件处理程序完成的. 当事件发生 ...
- Spring Boot————ApplicationListener实现逃课事件监听
引言 上一篇文章转了一篇关于ApplicationListener用于在Web项目启动时做一些初始化的用法. 但是,在实际生产过程中,当一个事件产生,又是如何被onApplicationEvent() ...
- 框架源码专题:Spring的事件监听、发布机制 ApplicationListener
文章目录 1.Spring内置事件 2.自定义事件 3.事件监听器 4.事件发布 publishEvent 4.Spring事件原理 5. 面试题:怎么样可以在所有Bean创建完后做扩展代码? 6. ...
- RN性能优化以及事件监听
自从React Native出世,虽然官方一直尽可能的优化其性能,为了能让其媲美原生App的速度,但是现实感觉有点不尽人意.接下来介绍下实践中遇到的一些性能问题以及优化方案. 一.StackNavig ...
- 监听返回app_基于 Redis 消息队列实现 Laravel 事件监听及底层源码探究
在 Laravel 中,除了使用 dispatch 辅助函数通过 Illuminate\Bus\Dispatcher 显式推送队列任务外,还可以通过事件监听的方式隐式进行队列任务推送,在这个场景下,事 ...
- 编写一个IDEA插件之:事件监听
事件监听,我们最熟悉不过的就是开发APP时,监听按钮点击事件.手指触摸及移动事件.网络状态事件等等.事件监听大多通过观察者模式实现,首先API调用者不需要知道后台是如何检测出网络状态不可用的,而只需要 ...
- Springboot事件监听机制:工作原理
目录 前言 1.观察者模式 1.1观察者模式的核心元素 1.2观察者模式的工作流程 2.springboot事件监听机制的基本工作原理 2.1事件发布器是什么时候在哪里产生的呢? 2.2事件监听器是什 ...
- Java 创建事件Event、事件监听EventListener、事件发布publishEvent
一.概述 个人认为,事件机制一般可由:事件源source,事件对象Event,事件监听EventListener,事件发布publishEvent组成 事件源:引起事件发生的源: User用户信息, ...
- Java语言学习--Swing中Button事件监听
1 前言 今天在使用Java Swing中的JButton的事件触发机制时遇到了许多问题,简单的了解了一下. 2 事件监听机制 事件监听的机制如下图所示分析. 3 代码分析 3.1 分步解析 1.事件 ...
最新文章
- linux运维基础篇 unit14
- Simulink中From、Goto模块
- 9、图书修改,删除功能
- mysql查询某张表的所有外键_oracle中查询所有外键引用到某张表的记录
- 用C#实现软件自动更新
- rabbitmq channel对象的方法
- 【My Sft】彩色图像分析软件V1.0.1.0
- 「管理数学基础」3.4 凸分析:最优性的充要条件、无约束极小化问题、一般非线性规划问题
- java 爬虫 html页面 parse,Java 爬虫 爬取html网页解析
- gsyVideoPlayer直播短视频回放,集成腾讯播放器(2)
- [数据分析笔记] 网易云歌单分析系列01—爬取网易云歌单信息
- java 鼠标变成手型_当鼠标放在按钮上时让指针变为手型
- 如何通过自媒体创业月入万元
- 生信必会格式:Fasta Fastq 简介及转换
- 新一代的数据库备份解决方案--Oracle数据库
- Android应用面试题及答案汇总
- 修改Android app图标(Android Studio)
- Excel如何把全部符合单个条件的数据提取出
- 这个传奇大佬,自杀了!
- 颜色帮你缓解职场压力 给你的心情换个色
热门文章
- python中sys.argv的用法_python的sys.argv[]用法解释
- 致敬达叔 -- 80、90的童年观影记忆
- C++多线程detach函数使用
- python+opencv读取文件夹图片并保存
- vb局域网连接mysql_VB 用代码进行局域网内数据库的连接
- diamond mysql_TDDL动态数据源Diamond配置
- 拳皇世界6月13服务器维护,拳皇世界2月8日例行维护 数据互通公告[图]
- ​杠杆率是什么意思?外汇杠杆率高好还是低好?
- 恢复win7快速启动栏
- JAVA 中的修饰符的适用范围