日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(后台)Openbravo如何实现业务事件监听处理

發(fā)布時(shí)間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (后台)Openbravo如何实现业务事件监听处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 介紹

? ? ? ? ?業(yè)務(wù)事件允許你進(jìn)行一些邏輯處理,在一個(gè)對(duì)象進(jìn)行保存,修改或者刪除的時(shí)候。就像數(shù)據(jù)庫里面的觸發(fā)器一樣,但是它的優(yōu)點(diǎn)是,你可以通過java代碼來實(shí)現(xiàn)你想要的功能,方便調(diào)試與實(shí)現(xiàn)。比如你想在生成銷售訂單的時(shí)候自動(dòng)生成一個(gè)單據(jù)號(hào),可以利用業(yè)務(wù)事件來處理。具體參考如下這個(gè)類:SetDocumentNoHandler


2. 簡單示例

? ? ? ? ?我們先來一個(gè)簡單示例,如下代碼所示:

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");} }? ? ? ? 需要注意如下幾點(diǎn):

? ? ? ?1. 繼承于EntityPersistenceEventObserver 類,幫助過濾出正確的事件(因?yàn)樗械谋4?#xff0c;修改,刪除事件都會(huì)發(fā)送過來,我們需要刷新出自己感興趣的事件)

? ? ? ?2. 方法名不重要,比如里面的onDelete方法,主要的是那個(gè)參數(shù)的聲明@Observes EntityDeleteEvent event, Weld框架利用這個(gè)參數(shù)聲明來判定哪些事件應(yīng)該發(fā)送給這個(gè)方法。

? ? ? ?3. 任何一個(gè)實(shí)體更新,保存,修改都會(huì)發(fā)送事件到這個(gè)eventHandler的對(duì)應(yīng)方法,每一個(gè)方法頭部,都需要通過方法isValidEvent事件來判斷這個(gè)事件是否為自己感興趣的。

? ? ? ?4. 我們通過org.apache.log4j.Logger類來記錄日志。


3. 簡單展示

? ? ? ? ? 當(dāng)你將這個(gè)類加入你的模塊,重啟tomcat的時(shí)候,進(jìn)入稱呼這個(gè)窗口:http://localhost:8080/openbravo/?tabId=282你將在控制臺(tái)看到你記錄的日志。


4. 更復(fù)雜一點(diǎn)示例

? ? ? ?假如我們要在更新的時(shí)候判斷title字段是否有一點(diǎn),如果沒有,在末尾加上一點(diǎn)。在保存的時(shí)候,增加一個(gè)子表翻譯。如下代碼所示:

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");} ? ? ? ?這里需要注意幾點(diǎn):

? ? ? ?1. 獲取字段名通過新建一個(gè)空實(shí)體,如下代碼所示

final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
? ? ? ? 2. 修改一個(gè)保存前實(shí)體某一個(gè)字段的值,不能用set方法,必須如下所示:

event.setCurrentState(greetingTitleProperty, title + ".");
? ? ? ? 3. 新建一個(gè)需要持久化的實(shí)體,不能用new關(guān)鍵字,必須如下所示:

final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);
? ? ? ? 4. 新建的子實(shí)體不需要自己調(diào)用代碼進(jìn)行持久化,會(huì)隨著主實(shí)體持久化而持久化。


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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。