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

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

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

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

 

[xhtml] view plaincopy
  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。

而我实际类如下:

 

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

 

我传入的参数将从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对应到指定的处理函数上。

增加如下:

 

[xhtml] view plaincopy
  1. <!-- 引擎接口 -->  
  2. <request-map uri="httpService">  
  3.     <event type="java" path="org.ofbiz.service.engine.HttpEngine" invoke="httpEngine"/>  
  4.     <response name="success" type="none"/>  
  5.     <response name="error" type="none"/>  
  6. </request-map>  
  7. <request-map uri="SOAPService">  
  8.     <event type="soap"/>  
  9.     <response name="error" type="none"/>  
  10.     <response name="success" type="none"/>  
  11. </request-map>  
  12. <request-map uri="xmlrpc" track-serverhit="false" track-visit="false">  
  13.     <event type="xmlrpc"/>  
  14.     <response name="error" type="none"/>  
  15.     <response name="success" type="none"/>  
  16. </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文件是否可用

转载于:https://www.cnblogs.com/Ivan-j2ee/archive/2012/08/16/2642451.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql常见函数

###进阶4&#xff1a;常见函数一、单行函数1、字符函数concat拼接substr截取子串upper转换成大写lower转换成小写trim去前后指定的空格和字符ltrim去左边空格rtrim去右边空格replace替换lpad左填充rpad右填充instr返回子串第一次出现的索引length 获取字节个数2、数学函数round…

数组循环移位

设计一个算法&#xff0c;把一个含有N个元素的数组循环右移K位&#xff0c;要求时间复杂度为O&#xff08;N&#xff09;&#xff0c;且只允许使用两个附加变量。 不合题意的解法如下&#xff1a; 我们先试验简单的办法&#xff0c;可以每次将数组中的元素右移一位&#xff0c;…

数据结构之树概述

非线性结构&#xff1a; 树的定义&#xff1a;树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个节点的有限集T。它或是空集&#xff08;空树即n0&#xff09;&#xff0c;或者是非空集。 对于任意一颗非空树&#xff1a; &#xff08;1&#xff09;有且仅…

IIS7中WCF配置问题集合

1 IIS注册WCF 以管理员身份运行命令行&#xff1a; "C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r -y 2 问题&#xff1a;无法找到 ServiceHost 指令中作为服务属性值提供的类型 将网站转换为应用程序 3 无法…

解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错&#xff1a;scanf_s函数报错:没有为格式字符串传递足够的参数 int main() {char s1[20] "i m name";char *p1, *p2;char s3[10] {0};p1 s1;p2 s3;printf("请输入你的名字: \n");scanf_s("%s",&s3);printf("%s\n", s3);f…

Commons codec jar包详解

Commons项目中用来处理常用的编码方法的工具类包&#xff0c;例如DES、SHA1、MD5、Base64, 及 hex, metaphone, soundex 等编码演算。 JavaDoc:http://www.osctools.net/apidocs/apidoc?apicommons-codec 官网下载地址&#xff1a;http://commons.apache.org/codec/ 使用&…

数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

在一个单链表中,若删除p指向节点的后继节点,则执行的操作为&#xff1a;&#xff08; &#xff09; A.qp->next; p->nextp->next->next; free(q) B.pp->next; qp->next;pq->next; free(q) C.qp->next->next; pp->next; free(q) D.pp->next-&…

使用ActionScript实现滤镜效果

使用ActionScript实现滤镜效果2009年02月24日 11:17用as做滤镜效果&#xff0c;每种滤镜效果对应一个类别&#xff0c;这些类别将来会在Macromedia\Flash 8\语系\First Run\Classes\FP8\flash\filters 这个资料夹中. 一、渐变斜角——GradientBevelFilter类别 二、投影——Drop…

已知先序和中序求后序

先序: ABCDEFGH 中序: BDCEAFHG 求后序:DECBHGFA 具体看B站郝斌视频&#xff1a;https://www.bilibili.com/video/BV11s41167h6?p71

微软的Surface平板电脑RT版,RT是什么缩写?|转|

http://www.guokr.com/question/240887/ 1# 其实rt是win8家族的新成员&#xff0c;专为arm系列处理器设计的windows 8版本&#xff0c;不兼容win32程序 2# zzllrr 2012-06-21 09:28:19 找到权威解答了&#xff1a;“RT”代表“Runtime”的意思。既Windows Runtime Library&…

对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 ()

对广义表L((a&#xff0c;b)&#xff0c;(c&#xff0c;d)&#xff0c;(e&#xff0c;f))执行操作tail(tail(L))的结果是 ( ) 。 A&#xff0e;(e&#xff0c;f) B&#xff0e;((e&#xff0c;f)) C&#xff0e;(f) D&#xff0e;() 本题考查广义表的概念和特征。 广义表是线性…

USACO sec2.1 Ordered Fractions

首先两重 for 循环对可能取的值约分&#xff0c;分子分母分别存放&#xff0c;根据比较分数大小的方法排序&#xff0c;然后按顺序输出&#xff08;相同的只输出一个&#xff09;&#xff1b; /* PROG : frac1 LANG : C */ # include <stdio.h> # include <stdlib.h&g…

二维教组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为 ( )

二维教组A[12][18]采用列优先的存储方法&#xff0c;若每个元素各占3个存储单元&#xff0c;且第1个元素的地址为150&#xff0c;则元素A[9][7]的地址为 ( ) A&#xff0e;429 B&#xff0e;432 C&#xff0e;435 D&#xff0e;438 [分析] 本题考查数组元素存储地址的计算。…

python threading 两种创建方式

作用&#xff1a;建立在thread模块之上&#xff0c;可以更容易地管理多个执行线程。 通过使用线程&#xff0c;程序可以在同一个进程空间并发地运行多个操作。threading模块建立在thread的底层特性基础上&#xff0c;可以更容易地完成线程处理。 1、调用函数 要使用Thread&…

对广义表L=((a,b),c,d)进行操作tail(head(L))的结果是

对广义表L((a,b),c,d)进行操作tail(head(L))的结果是( ) A&#xff0e;&#xff08;c,d&#xff09; B&#xff0e;(d) C&#xff0e; b D&…

ScaleForm十六戒言

不知不觉&#xff0c;在不停地叫骂、哀嚎、惊叹、欢喜中&#xff0c;开发工作已经走过了一个节点了&#xff0c;UE3作为一个顶级&#xff0c;维护多年的引擎&#xff0c;层层深入后&#xff0c;发现每一块都有值得深入&#xff0c;值得改进的地方&#xff0c;平时负责一些场景&…

一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为

一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构&#xff0c;则计算该有向图中某个顶点出度的时间复杂度为( ) A&#xff0e;O(n) B&#xff0e;O(e) C&#xff0e;O(ne) …

PO三种状态

PO三种状态&#xff1a; 瞬态&#xff1a;如果PO实例从未与Session关联过&#xff0c;该PO实例处于瞬态状态。 持久化&#xff1a;如果PO实例与Session关联起来&#xff0c;且该实例对应到数据库记录&#xff0c;则该实例处于持久化状态。 托管&#xff1a;如果PO实例曾经与ses…

C++Primer学习之一引用和指针

一&#xff0e;引用 引用是一种复合类型&#xff0c;引用分为左值引用和右值引用&#xff0c;其中右值引用时C11提出来的&#xff0c; 常说的引用其意为左值引用。注意&#xff1a;引用不是对象&#xff0c;它是一个对象&#xff08;变量&#xff09;的别名&#xff0c;不能改…

第四课 脱壳必备知识要点及方法

第四课 脱壳必备知识要点及方法 今天所要讲的是这高级篇中最为关键&#xff0c;最为重要的一课&#xff0c;希望大家能认真学习&#xff0c;反复推敲&#xff0c;举一反三学习脱壳的各种方法&#xff0c;当然有的时候可能需要几种方法一起使用&#xff0c;今后我们也会一点一点…