ofbiz的service:這個是ofbiz賴以驕傲的設計方式。她可以將所有內部實體對象的CRUD都使用service的方式提供,不同系統之間可以通過互相調用service來完成業務操作。這種鬆耦合的方式是很多框架夢寐以求的效果。
在ofbiz4的文檔中提到,如果想將ofbiz的某個服務開放成webservice只是需要輕輕的將我們定義service文件中的service屬性中的export設定爲true。
例如:我的一個ofbiz項目的servicedef目錄下的services.xml文件中定義了一個服務
- <service
- name="findSeniorService"
- engine="java"
- location="com.hc360.cem.ws.CEMSeniorMemberService"
- invoke="findSeniorService"
- export="true"
- validate="false"
- auth="false">
- <description>CRM call CEM findSeniorService soap</description>
- <attribute name="userid" type="String" mode="INOUT" optional="true"/>
- <attribute name="salt" type="String" mode="IN" optional="true"/>
- <attribute name="aaa" type="String" mode="OUT" optional="true"/>
- <attribute name="bbb" type="String" mode="OUT" optional="true"/>
- <attribute name="ccc" type="String" mode="OUT" optional="true"/>
- </service>
上邊圖片的意思就是將:com.hc360.cem.ws.CEMSeniorMemberService類中的findSeniorService作爲soap接口提供出去。輸入參數有userid、salt,輸出參數有userid、aaa、bbb、ccc。
而我實際類如下:
- import java.util.Map;
- import javolution.util.FastMap;
- import org.ofbiz.base.util.Debug;
- import org.ofbiz.service.DispatchContext;
- public class CEMSeniorMemberService {
- /**
- * 開放一個service供測試使用
- * wsdl的訪問方式:http://yourip:port/project/control/SOAPService/findSeniorService?wsdl
- * 但是ofbiz給我們生成的wsdl使用任何的客戶端生成工具都無法正確生成,但是這個webservice接口是可以使用的
- * @author kongqz
- * @date 2009-03-11
- *
- * */
- public static Map<String, Object> findSeniorService(DispatchContext ctx, Map<String, ? extends Object> context) {
- //存放結果的map
- Map<String, Object> result = FastMap.newInstance();
- // GenericDelegator delegator = ctx.getDelegator();
- String userid = (String) context.get("userid");
- String salt = (String) context.get("salt");
- Debug.logInfo("salt is ["+salt+"],userid is ["+userid+"] ", "findSeniorService");
- result.put("aaa", "test_aaaaa");
- result.put("bbb", "test_bbbbb");
- result.put("ccc", "test_ccccc");
- result.put("userid", userid);
- return result;
- }
- }
我傳入的參數將從ofbiz的這個context中獲取,而我返回的參數將通過result這個map來put出去。
這裏我想說明的是:這個時候如果我調用如下鏈接:
http://yourip:port/projectname/control/SOAPService/findSeniorService?wsdl
就可以看到我這個服務的wsdl文件。
如果想看整個項目所有暴露給外部訪問的webservice有哪些,我可以使用
http://yourip:port/projectname/control/SOAPService?wsdl
來進行查看。
通過上邊wsdl鏈接我們需要知道一點,我們的SOAPService哪裏來的?
這裏就需要指出,如果想將你的SOAPService暴露給外部,需要ofbiz的controller來做點貢獻。因爲ofbiz的外部請求都是通過ofbiz的servlet來處理的,入口點是項目的controller文件,我們需要給controller文件增加支持。
controller文件:ofbiz當前項目的所有請求的入口,通過對應request-map:將所有的請求uri對應到指定的處理函數上。
增加如下:
- <!-- 引擎接口 -->
- <request-map uri="httpService">
- <event type="java" path="org.ofbiz.service.engine.HttpEngine" invoke="httpEngine"/>
- <response name="success" type="none"/>
- <response name="error" type="none"/>
- </request-map>
- <request-map uri="SOAPService">
- <event type="soap"/>
- <response name="error" type="none"/>
- <response name="success" type="none"/>
- </request-map>
- <request-map uri="xmlrpc" track-serverhit="false" track-visit="false">
- <event type="xmlrpc"/>
- <response name="error" type="none"/>
- <response name="success" type="none"/>
- </request-map>
通過在controller.xml文件上的支持,你才能將httpService,SOAPService,xmlrpc這些服務對外提供,你的鏈接才能寫成上邊的方式。
總結下ofbiz的webservice提供前提:
1、controller的支持,SOAPService的接口暴露】
2、service類的提供,這個類是static方式的,數據的傳入傳出使用map方式(注意那個context)
3、services.xml文件的定義,將你的webservice定義在這裏,並設定export=true,否則只能是一個內部的service了。
4、訪問我們項目提供的所有webservice,看wsdl文件是否可用