微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

转 ofbiz的webservice接口提供1-WSDL的生成

ofbiz的service:这个是ofbiz赖以骄傲的设计方式。她可以将所有内部实体对象的CRUD都使用service的方式提供,不同系统之间可以通过互相调用service来完成业务操作。这种松耦合的方式是很多框架梦寐以求的效果。 @H_502_5@

在ofbiz4的文档中提到,如果想将ofbiz的某个服务开放成webservice只是需要轻轻的将我们定义service文件中的service属性中的export设定为true。@H_502_5@

例如:我的一个ofbiz项目的servicedef目录下的services.xml文件中定义了一个服务@H_502_5@

@H_502_5@

[xhtml] view plain copy
  1. <service  
  2.     name="findSeniorService"   
  3.     engine="java"  
  4.     location="com.hc360.cem.ws.CEMSeniorMemberService"  
  5.     invoke="findSeniorService"  
  6.     export="true"  
  7.     validate="false"  
  8.     auth="false"> 
  9.     <description>CRM call CEM findSeniorService soap</description> 
  10.     <attribute name="userid" type="String" mode="INOUT" optional="true"/> 
  11.     <attribute name="salt" type="String" mode="IN" optional="true"/> 
  12.     <attribute name="aaa" type="String" mode="OUT" optional="true"/>       
  13.     <attribute name="bbb" type="String" mode="OUT" optional="true"/>       
  14.     <attribute name="ccc" type="String" mode="OUT" optional="true"/>       
  15. </service> 

上边图片的意思就是将:com.hc360.cem.ws.CEMSeniorMemberService类中的findSeniorService作为soap接口提供出去。输入参数有userid、salt,输出参数有userid、aaa、bbb、ccc。@H_502_5@

而我实际类如下:@H_502_5@

@H_502_5@

[c-sharp] copy
    import java.util.Map; 
  1. import javolution.util.FastMap; 
  2. import org.ofbiz.base.util.Debug; 
  3. import org.ofbiz.service.dispatchContext; 
  4.  
  5. public class CEMSeniorMemberService { 
  6.    /**
  7.     * 开放一个service供测试使用
  8.     * wsdl的访问方式:http://yourip:port/project/control/SOAPService/findSeniorService?wsdl
  9.     * 但是ofbiz给我们生成的wsdl使用任何的客户端生成工具都无法正确生成,但是这个webservice接口是可以使用的
  10.     * @author kongqz
  11.     * @date 2009-03-11
  12.     *
  13.     * */ 
  14.     public static Map<String,Object> findSeniorService(dispatchContext ctx,Map<String,? extends Object> context) { 
  15.         //存放结果的map 
  16.         Map<String,Object> result = FastMap.newInstance(); 
  17. //        GenericDelegator delegator = ctx.getDelegator(); 
  18.         String userid = (String) context.get("userid"); 
  19.         String salt = (String) context.get("salt"); 
  20.         Debug.logInfo("salt is ["+salt+"],userid is ["+userid+"] ","findSeniorService"); 
  21.         result.put("aaa","test_aaaaa"); 
  22.         result.put("bbb","test_bbbbb"); 
  23.         result.put("ccc","test_ccccc"); 
  24.         result.put("userid",userid); 
  25.         return result; 
  26.     } 

@H_502_5@

我传入的参数将从ofbiz的这个context中获取,而我返回的参数将通过result这个map来put出去。@H_502_5@

这里我想说明的是:这个时候如果我调用如下链接:@H_502_5@

http://yourip:port/projectname/control/SOAPService/findSeniorService?wsdl@H_502_5@

就可以看到我这个服务的wsdl文件。@H_502_5@

@H_502_5@

如果想看整个项目所有暴露给外部访问的webservice有哪些,我可以使用@H_502_5@

http://yourip:port/projectname/control/SOAPService?wsdl@H_502_5@

来进行查看。@H_502_5@

通过上边wsdl链接我们需要知道一点,我们的SOAPService哪里来的?@H_502_5@

这里就需要指出,如果想将你的SOAPService暴露给外部,需要ofbiz的controller来做点贡献。因为ofbiz的外部请求都是通过 ofbiz的servlet来处理的,入口点是项目的controller文件,我们需要给controller文件增加支持。@H_502_5@

controller文件:ofbiz当前项目的所有请求的入口,通过对应request-map:将所有的请求uri对应到指定的处理函数上。@H_502_5@

增加如下:@H_502_5@

@H_502_5@

copy
    <!-- 引擎接口 --> 
  1. <request-map uri="httpService"> 
  2.     <event type="java" path="org.ofbiz.service.engine.HttpEngine" invoke="httpEngine"/> 
  3.     <response name="success" type="none"/> 
  4.     <response name="error" type="none"/> 
  5. </request-map> 
  6. <request-map uri="SOAPService"> 
  7.     <event type="soap"/> 
  8. </request-map> 
  9. <request-map uri="xmlrpc" track-serverhit="false" track-visit="false"> 
  10.     <event type="xmlrpc"/> 
  11.     <response name="error" type="none"/> 
  12.     <response name="success" type="none"/> 
  13. </request-map> 

通过在controller.xml文件上的支持,你才能将httpService,SOAPService,xmlrpc这些服务对外提供,你的链接才能写成上边的方式。@H_502_5@

  总结下ofbiz的webservice提供前提:@H_502_5@

  1、controller的支持,SOAPService的接口暴露】@H_502_5@

  2、service类的提供,这个类是static方式的,数据的传入传出使用map方式(注意那个context)@H_502_5@

  3、services.xml文件的定义,将你的webservice定义在这里,并设定export=true,否则只能是一个内部的service了。@H_502_5@

  4、访问我们项目提供的所有webservice,看wsdl文件是否可用@H_502_5@

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐