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 {?
- ??
-
-
-
-
-
-
- ?
- ??? public static Map<String,Object> findSeniorService(DispatchContext ctx,Map<String,? extends Object> context) {?
- ??????? ?
- ??????? Map<String,Object> result = FastMap.newInstance();?
- ?
- ??????? 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"/>?
- </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文件是否可用
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|