(后台)Openbravo如何实现业务事件监听处理
1. 介紹
? ? ? ? ?業(yè)務(wù)事件允許你進行一些邏輯處理,在一個對象進行保存,修改或者刪除的時候。就像數(shù)據(jù)庫里面的觸發(fā)器一樣,但是它的優(yōu)點是,你可以通過java代碼來實現(xiàn)你想要的功能,方便調(diào)試與實現(xiàn)。比如你想在生成銷售訂單的時候自動生成一個單據(jù)號,可以利用業(yè)務(wù)事件來處理。具體參考如下這個類: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 類,幫助過濾出正確的事件(因為所有的保存,修改,刪除事件都會發(fā)送過來,我們需要刷新出自己感興趣的事件)
? ? ? ?2. 方法名不重要,比如里面的onDelete方法,主要的是那個參數(shù)的聲明@Observes EntityDeleteEvent event, Weld框架利用這個參數(shù)聲明來判定哪些事件應(yīng)該發(fā)送給這個方法。
? ? ? ?3. 任何一個實體更新,保存,修改都會發(fā)送事件到這個eventHandler的對應(yīng)方法,每一個方法頭部,都需要通過方法isValidEvent事件來判斷這個事件是否為自己感興趣的。
? ? ? ?4. 我們通過org.apache.log4j.Logger類來記錄日志。
3. 簡單展示
? ? ? ? ? 當(dāng)你將這個類加入你的模塊,重啟tomcat的時候,進入稱呼這個窗口:http://localhost:8080/openbravo/?tabId=282你將在控制臺看到你記錄的日志。
4. 更復(fù)雜一點示例
? ? ? ?假如我們要在更新的時候判斷title字段是否有一點,如果沒有,在末尾加上一點。在保存的時候,增加一個子表翻譯。如下代碼所示:
public void onUpdate(@ObservesEntityUpdateEvent 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 directlyevent.setCurrentState(greetingTitleProperty, title + ".");}System.err.println("Greeting " + event.getTargetInstance().getId() + " is being updated");}public void onSave(@ObservesEntityNewEvent 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 titlefinal 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 directlyevent.setCurrentState(greetingTitleProperty, title + ".");}final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);// set relevant translation propertiesgreetingTrl.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 entityfinal 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關(guān)鍵字,必須如下所示:
final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);
? ? ? ? 4. 新建的子實體不需要自己調(diào)用代碼進行持久化,會隨著主實體持久化而持久化。
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));}}
總結(jié)
以上是生活随笔為你收集整理的(后台)Openbravo如何实现业务事件监听处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看显存占用
- 下一篇: 帝国cms html广告,帝国cms加入