You are on page 1of 36

ORACLE EBS

--Web Service 开发笔记


Author: Jarwang(王重东)

Create Date: April 5, 2011

Create Location: BeiJing

Update Date:

Control No:

Current Edition: 1.0

声明:本文可以任意免费转载、复制、传播。但您务必保持其完整性!

If you copy this document,you ought to keep the document completely.

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


1
Document Control

Modify Record

日期 作者 版本 更改参考

April 5, 2011 jarwang 1.0

Approved

姓名 职位 签字

Distribute

编码 姓名 地点和位置

1
2
3
4

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


2
Content
Document Control 2
Modify Record 2
Approved 2
Content 3

Preface 4

Web Service Foundation 5


Concept 5
XML 5
SOAP 6
WSDL 6
UDDI 7
REST Web Service 7
Web Service For Axis1.4 8
Download 8
Configure 8
JDK1.6 8
Tomcat5.5 8
Axis1.4 9
Test a SOAP Endpoint 10
Test a JWS Endpoint 11
Axis1.4 for Development 11
Instant Deployment 11
Custom Deployment 13
RMI 16
Cancel Deployment 17
Handle 18
Chain 18
Transfer Object 18
WSDL2Java 25
Web Service For EBS11i 27
Axis1.4 for EBS11i 27
Oracle Callin WebService 27
Oracle Callout WebService 27
Download Jar Files 28
Load Jar Files 28
Permission 28
Create WebService Callout Package 29
Web Service For R12 31
PLSQL Deploy WebService 31
Create the Package 31
Create the WebService 31
Deploy the WebService 33
Integration Repository 33
Oracle XML Gateway 35

Other Notes 36

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


3
Preface
对于Oracle EBS而言,与第三方系统集成有很多方式。如:在EBS二次开发中常用的是Interface Table或EBS各模
块的API接口。对跨地域的集成方案,也可采用诸如银企直接接口技术那般,通过手工编程将数据转换成XML文件,
然后数据签名加密传给第三方系统。如:AP发票付款流程。Oracle EBS将生成好AP发票,打包成XML报文传给第三
方系统。再由第三方系统向通过银企直连接口发起付款请求。付款成功后,写回成功标志,然后由EBS自动生成AP
付款。

Web Service为异构系统的集成提供更为快捷的方法。另外Oracle EBS提供XML GateWay也可实现异常系统之集


成。在R12版本中,Oracle更加向SOA(Service Oriented Architecture面向服务的体系结构)全面靠拢。

本文参考文档:Axis1.4 User's Guide

Oracle® Application Server Web Services Developer's Guide 10g

Oracle® XML Gateway User's Guide

http://www.w3school.com.cn/

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


4
Web Service Foundation

Concept

WebService 让一个程序可以透明地调用互联网的程序,不用管具体的实现细节。只要
WebService公开了服务接口,远程客户端就可以调用服务。WebService是基于http 协议的组件
服务,WebService 是分散式应用程序的发展趋势。

在构建和使用Web Service时,主要用到以下几个关键的技术和规则:

1.XML:描述数据的标准方法.

2.SOAP(Simple Object Acess Protocol):表示信息交换的协议.

3.WSDL(Web Service Description Language):Web服务描述语言.

4.UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种


独立于平台的,基于XML语言的用于在互联网上描述商务的协议。

XML

XML 指可扩展标记语言(Extend Mark Language)。XML 被设计用来传输和存储数据。

XML 元素:指的是从(且包括)开始标签直到(且包括)结束标签的部分。

<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

XML属性: 提供关于元素的额外(附加)信息。XML 元素可以在开始标签中包含属性。

<book category="WEB">

category就是book元素的属性。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


5
SOAP

SOAP(Simple Object Acess Protocol)是基于 XML 的简易协议,可使应用程序在 HTTP 之上进


行信息交换。

WSDL

WSDL(Web Service Description Language):Web服务描述语言。通常WSDL文件包含:

1、类型:定义复合数据类

2、消息:由类型组合成消息(可以作为下面操作的参数)

3、操作:其中定义可以调用的操作,每个操作的参数。操作的集合对外呈现一个接口

4、绑定:定义每个操作具体的调用方式,数据的编码方式()

5、服务:对外呈现服务,可以包含多个绑定

6、端口:远程地址

其中,1,2,3被称为逻辑的描述; 4,5,6用来描述具体的服务地址和参数编码方式

WSDL示例:

<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


6
UDDI

UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。

ü UDDI 指通用的描述、发现以及整合(Universal Description, Discovery and Integration)。

ü UDDI 是一种用于存储有关 web services 的信息的目录。

ü UDDI 是一种由 WSDL 描述的网络服务接口目录。

ü UDDI 经由 SOAP 进行通迅。

REST Web Service

依赖于SOAP协议的Web Service,在WEB2.0互联网中显得过于臃肿。于是REST就诞生了。

REST: Representational State Transfer (表述性状态转移)。

REST Web Service:通过超文本传输协议(HTTP)发送简单的消息来实现 SOA,这基本上就


是 REST 式 Web 服务 (RESTful Web services) 的工作方式。

RESTful HTTP核心操作包括:

Ø GET - 该操作返回已标识资源的状态表示。您可以通过大量的上下文要素来确定状态,例如
谁正在提交请求、操作的参数(传入的参数如 HTTP 头或者查询字符串参数)和服务提供
方维护的当前会话状态。

Ø POST - 该操作执行对已标识资源的一些特定于应用程序形式的更新。该操作行为完全依赖
于实现它的服务。由该操作返回的数据也完全依赖于应用程序。举例来说,像 GET 操作一
样,它可以返回一个状态表示,它还可以选择根本不返回任何数据。

Ø PUT - 该操作在已标识位置(URI)创建新资源。操作输入必须包括一个资源的状态表示。
它完全依赖服务来创建基于这个状态表示的资源。

Ø DELETE - DELETE 操作销毁已标识位置(URI)的资源。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


7
Web Service For Axis1.4
Axis(AApache eXtensible Interaction System)是一款开源的 WebService 运行引擎,它是SOAP
协议的一个实现,其本身来源于 Apache 的另一个项目 Apache SOAP。Axis 分为 1.x系列和 2 系
列,两个系列体系结构和使用上有较大的区别。本文基于Axis1.4

Download

下载JDK1.6:http://www.oracle.com/technetwork/java/javase/downloads/index.html

下载Tomcat5.5:http://tomcat.apache.org/download-55.cgi

下载Axis1.4:http://www.apache.org/dyn/closer.cgi/ws/axis/1_4

Configure

JDK1.6

安装JDK1.6,略

Tomcat5.5

1.解压Tomcat。

2.配置好JAVA环境变量。有两方法:

方法一:在系统环境变量,设置JAVA_HOME、CLASS_PATH变量。

在window的命令行,执行

SETX JAVA_HOME F:\ProgramFiles\WebServiceTools\Java\jdk1.6.0_25 /M


SETX CLASSPATH .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar; /M
SETX PATH "%JAVA_HOME%\bin;%PATH%;" /M

注:set命令只能在当前的dos窗体生效。要永久生效,必须使用setx命令。

方法二:修改catalina.bat文件

修改apache-tomcat-5.5.33\bin目录下catalina.bat,加入红色部分(JDK的安装目录)。

rem JRE_HOME Must point at your Java Runtime installation.


rem Defaults to JAVA_HOME if empty.
SET JAVA_HOME=F:\ProgramFiles\WebServiceTools\Java\jdk1.6.0_25
rem

3.启动tomcat:apache-tomcat-5.5.33\bin\startup.bat

访问tomcat:http://127.0.0.1:8080/

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


8
Axis1.4

1.解压Axis压缩包,目录如下:

2.将webapps目录下的axis目录复制到tomcat服务器的webapps目录下。

3.测试是否安装成功。

测试地址:http://127.0.0.1:8080/axis/

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


9
点击“Validation”链接。

上述信息表达axis安装成功。另外两可选组件,可根据业务需要进行安装。

4.本文根据上述链接下载javamail1_4_4.zip、xml-security-bin-1_4_4.zip

解压javamail1_4_4.zip、xml-security-bin-1_4_4.zip。分别将javamail-1.4.4\lib\mailapi.jar、
xml-security-1_4_4\libs\xmlsec-1.4.4.jar复制到
apache-tomcat-5.5.33\webapps\axis\WEB-INF\lib目录下。

注:JDK1.6以下版本,配置Java Mail时无须下载JAF包。

5.3.4重启tomcat,再验证一次。所有包都安装正确啦。

Test a SOAP Endpoint

Test a SOAP Endpoint

http://localhost:8080/axis/services/Version?method=getVersion
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
10
Test a JWS Endpoint

Test a JWS Endpoint。JWS:Java Web Service.

http://localhost:8080/axis/EchoHeaders.jws?method=list

Axis1.4 for Development

Axis支持两种发布成Web Service方式:即时发布(Instant Deployment)、定制发布(Custom


Deployment)。

Instant Deployment

即时发布提供了一种非常快速发布方式。只要有Java源代码(也就是.java文件),然后把其后 缀
名 改 成 jws 拷 贝 到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。
AXIS的编译引擎会处理接下来的所有事情。

1.编写WS服务端Java类:Calculator.java

public class Calculator {


public int add(int i1, int i2)
{
return i1 + i2;
}
public int subtract(int i1, int i2)

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


11
{
return i1 - i2;
}
}

注:即时发布不支持带有包的j ava类,并且必须要有Java类源码.

2.将Calculator.java复制到apache-tomcat-5.5.33\webapps\axis目录下,并重命名为
Calculator.jws

3.重启tomcat,然后访问:http://127.0.0.1:8080/axis/Calculator.jws

点击“Click to see the WSDL”链接,可查看到WSDL描述文件。OK,Web Service发布成功。

4.编写客户端代码,调用Web Service。

JAVA:CalcClient.java

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
public class CalcClient
{
public static void main(String [] args) throws Exception {
Options options = new Options(args);
String endpoint = "http://localhost:" + options.getPort() +"/axis/Calculator.jws";
args = options.getRemainingArgs();

if (args == null || args.length != 3) {


System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
String method = args[0];
if (!(method.equals("add") || method.equals("subtract"))) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
12
}

Integer i1 = new Integer(args[1]);


Integer i2 = new Integer(args[2]);
Service service = new Service();
Call call = (Call) service.createCall();

call.setTargetEndpointAddress( new java.net.URL(endpoint) );


call.setOperationName( method );
call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN );
call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN );
call.setReturnType( XMLType.XSD_INT );
Integer ret = (Integer) call.invoke( new Object [] { i1, i2 });
System.out.println("Got result : " + ret);
}
}

编译CalcClient.java类时,要指定asix的Jar包。

javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CalcClient.java

执行

java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CalcClient -p8080 add 20 50

调用Web Service结果如下:

Custom Deployment

定制发布。此方式要求自定义一个WSDD(Web Service Deployment Descriptor)文件,因而可以


更加灵活。此方式是开发过程更为常用的方式。

1.编写WS服务端Java类:CusCalculator.java

package webservice.axis.wsdd;
public class CusCalculator {
public float add(float i1, float i2)
{
return i1 + i2;
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
13
}
public float subtract(float i1, float i2)
{
return i1 - i2;
}
}

然后将编译好CusCalculator.class类复制到
apache-tomcat-5.5.33\webapps\axis\WEB-INF\classes目录。

2.编写WSDD文件。

在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录下,新建文件:deploy.wsdd,并加入以
下内容:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- define the service, using the log handler we just defined -->
<service name="CusCalculatorService" provider="java:RPC">
<parameter name="className" value="webservice.axis.wsdd.CusCalculator"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="request"/>
</service>
</deployment>

3.执行发布命令。

切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录

cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

执行成功后,会在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录生成server-config.wsdd
文件。

注:发布时,要保持tomcat在startup状态。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


14
4.访问测试:http://127.0.0.1:8080/axis/servlet/AxisServlet

5.编写客户端代码,调用Web Service。

JAVA:CusCalcClient.java

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
public class CusCalcClient
{
public static void main(String [] args) throws Exception {
String endpoint = "http://127.0.0.1:8080/axis/services/CusCalculatorService";
Float i1 = new Float(20.32);
Float i2 = new Float(100.67);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
//调用哪个方法
call.setOperationName(new QName("add"));
//传入参数的类型
call.addParameter( "op1", XMLType.XSD_FLOAT, ParameterMode.IN );
call.addParameter( "op2", XMLType.XSD_FLOAT, ParameterMode.IN );
//设置WS返回类型
call.setReturnType( XMLType.XSD_FLOAT );
//调用WS
Float ret = (Float) call.invoke( new Object [] { i1, i2 });
System.out.println("Got result : " + ret);
}
}
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
15
注:定制发布与即时发布的代码基本相同,除了URL链接。

编译CalcClient.java类时,要指定asix的Jar包。

javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CusCalcClient.java

执行

java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CusCalcClient

调用Web Service结果如下:

RMI

除了上述两种方法外,还可以通过RMI方式调用WebService。

具体页言,在本地实现一个Remote接口,其中包含远程WS的方法(同名、同返回类型、同参数
类型),然后通过Service可以获得一个对远程WS对象的引用。用该引用可以直接像调用本地方
法一样调用远程方法。服务端不用做任何设置和调整。

1.服务端与Custom Deployment例子一样。

2.编写客户端RMI接口

public interface ICusCalculator extends java.rmi.Remote {


public float add(float i1,float i2);
public float subtract(float i1,float i2);
}

3.编写客户端代码:ClientRMIWS.java

import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class ClientRMIWS {


public static void main(String[] args){
try{
String url =
"http://127.0.0.1:8080/axis/services/CusCalculatorService";
Service service = new Service();
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
16
/*调用Web Service*/
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(url,"subtract"));
Float i = new Float(100.6);
Float j = new Float(76.6);
Float returnValue = (Float)call.invoke(new Object[]{i,j});
System.out.println("WS Result:i-j="+returnValue);
/*RIM调用Web Service*/
ICusCalculator remoteRef =
(ICusCalculator)service.getPort(url,ICusCalculator.class);
returnValue = remoteRef.subtract(i, j);
System.out.println("RMI WS Result:i-j="+returnValue);
}catch(ServiceException sex){
sex.printStackTrace();
}catch(RemoteException rex){
rex.printStackTrace();
}
}
}

直接调用WebService与通过RMI调用WebService结果:

编译ClientRMIWS.java类时,要指定asix的Jar包。

javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientRMIWS.java

执行

java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientRMIWS

Cancel Deployment

取消发布Web Service。

1.编写undeploy.wsdd文件。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


17
在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录下,新建文件:undeploy.wsdd,并加
入以下内容:

<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="CusCalculatorService" />
</undeployment>

2.执行发布命令。

切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录

cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

执行成功后,会在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录生成server-config.wsdd
文件。

注:取消发布时,要保持tomcat在startup状态。

Handle

Web Service的Handle类,可以实现在调用Web Service之前或之后,触发某个事件。

Chain

Web Service的Chain类,可以实现在调用Web Service之前或之后,触发一系列的事件。如果根


据不同的Client触发不同Handle。

Transfer Obj ect

前面的例子都是客户端向WebService传送简单的数据类型。本例实现客户端向Web Service传
递、获取自定义对象。

1.创建服务端JavaBean。

import java.io.Serializable;
public class Order implements Serializable {
private static final long serialVersionUID = 8590864216374509536L;
public int getOrderId() {
return OrderId;
}
public void setOrderId(int orderId) {
OrderId = orderId;

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


18
}
public String getOrderNum() {
return OrderNum;
}
public void setOrderNum(String orderNum) {
OrderNum = orderNum;
}
public String getOrderDate() {
return OrderDate;
}
public void setOrderDate(String orderDate) {
OrderDate = orderDate;
}
public String getOrderItem() {
return OrderItem;
}
public void setOrderItem(String orderItem) {
OrderItem = orderItem;
}
public float getOrderQty() {
return OrderQty;
}
public void setOrderQty(float orderQty) {
OrderQty = orderQty;
}
private int OrderId;
private String OrderNum;
private String OrderDate;
private String OrderItem;
private float OrderQty;
}

注:传递的自定义对象必须是可序列化的。

2.创建WS服务端Java类:

package webservice.axis.wsdd;
import java.util.HashMap;
import java.util.Map;

public class OrderManager {


/*通过WebService获取Order*/
public Map getOrderMap(){

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


19
Order order = new Order();
HashMap hashMap = new HashMap();
order.setOrderId(1);
order.setOrderNum("P0001");
order.setOrderDate("2011-3-1");
order.setOrderItem("Oracle Database User Guide");
order.setOrderQty(2);
hashMap.put(order.getOrderId(), order);
order = new Order();
order.setOrderId(2);
order.setOrderNum("P0002");
order.setOrderDate("2011-4-1");
order.setOrderItem("Oracle Weblogic User Guide");
order.setOrderQty(3);
hashMap.put(order.getOrderId(), order);
return hashMap;
}
/*通过WebService提交Order*/
public String setOrderMap(Order order){
HashMap hashMap = new HashMap();
hashMap.put(order.getOrderId(), order);
return "Commit Success!";
}
}

将上述编译好的Java class类复制到%tomcat%目录。

注:传送自定义对象后,在布署axis时,要将wsdl4j-1.5.1.jar一起布署到tomcat的lib目录.

3.编写WSDD文件

在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录下。新建文件:deploy.wsdd,并加入以
下内容:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="OrderManager" provider="java:RPC">
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
20
<parameter name="className" value="webservice.axis.wsdd.OrderManager"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNSD:Order" xmlns:myNSD="urn:OrderManager"
languageSpecificType="java:webservice.axis.wsdd.Order"/>
<parameter name="scope" value="request"/>
</service>
</deployment>

然后执行发布命令。

切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录

cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

注:发布时,要保持tomcat在startup状态。

访问:http://127.0.0.1:8080/axis/services/OrderManager?wsdl 可查看到axis自动生成的wsdl

4.创建客户端JavaBean,与服务端的JavaBean保持一致即可。

import java.io.Serializable;

public class Order implements Serializable {

private static final long serialVersionUID = 8590864216374509537L;

public int getOrderId() {


return OrderId;
}
public void setOrderId(int orderId) {
OrderId = orderId;
}
public String getOrderNum() {
return OrderNum;
}
public void setOrderNum(String orderNum) {
OrderNum = orderNum;
}
public String getOrderDate() {
return OrderDate;
}
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
21
public void setOrderDate(String orderDate) {
OrderDate = orderDate;
}
public String getOrderItem() {
return OrderItem;
}
public void setOrderItem(String orderItem) {
OrderItem = orderItem;
}
public float getOrderQty() {
return OrderQty;
}
public void setOrderQty(float orderQty) {
OrderQty = orderQty;
}
private int OrderId;
private String OrderNum;
private String OrderDate;
private String OrderItem;
private float OrderQty;
}

4. 3.创建客户端调用Web Service:

import java.util.HashMap;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;

public class ClientOrder {

public HashMap obtainOrder(){


HashMap hashMap = null;
String url = "http://127.0.0.1:8080/axis/services/OrderManager";

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


22
Service service = new Service();
try{
Call call = (Call)service.createCall();
//传入urn:OrderManager、Order参数应与WSDD中beanMapping定义的
一致。
QName qn = new QName("urn:OrderManager","Order");
BeanSerializerFactory sfClass = new
BeanSerializerFactory(Order.class,qn);
BeanDeserializerFactory dfClass = new
BeanDeserializerFactory(Order.class,qn);
call.registerTypeMapping(Order.class, qn, sfClass, dfClass);
call.setTargetEndpointAddress(new java.net.URL(url));

Object[] s[] = null;


call.setOperationName(new QName("OrderManager","getOrderMap"));
//设置WS返回类型
call.setReturnClass(HashMap.class);

hashMap= (HashMap)call.invoke(s);
System.out.println("WS HashMap size:"+hashMap.size());
for(Iterator it = hashMap.keySet().iterator();it.hasNext();){
Integer key = (Integer)it.next();
Order order = (Order)hashMap.get(key);
System.out.println("*******************************");
System.out.println("OrderID="+order.getOrderId());
System.out.println("OrderNum="+order.getOrderNum());
System.out.println("OrderDate="+order.getOrderDate());
System.out.println("OrderItem="+order.getOrderItem());
System.out.println("OrderQty="+order.getOrderQty());
}

}catch(ServiceException ex){
ex.printStackTrace();
}catch(MalformedURLException ex){
ex.printStackTrace();
}catch(RemoteException ex){
ex.printStackTrace();
}
return hashMap;
}

public void requestOrder(){

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


23
String url = "http://127.0.0.1:8080/axis/services/OrderManager";
Service service = new Service();
Order order = new Order();
order.setOrderId(3);
order.setOrderDate("2011-4-15");
order.setOrderNum("P000015");
order.setOrderItem("Think in Java");
order.setOrderQty(5);

try{
Call call = (Call)service.createCall();
//传入urn:OrderManager、Order参数应与WSDD中beanMapping定义的
一致。
QName qn = new QName("urn:OrderManager","Order");
BeanSerializerFactory sfClass = new
BeanSerializerFactory(Order.class,qn);
BeanDeserializerFactory dfClass = new
BeanDeserializerFactory(Order.class,qn);
call.registerTypeMapping(Order.class, qn, sfClass, dfClass);
call.setTargetEndpointAddress(new java.net.URL(url));
//指明WS调用的类及方法
call.setOperationName(new QName("OrderManager","setOrderMap"));
call.addParameter( "map", XMLType.XSD_ANYTYPE,
ParameterMode.IN );
call.setReturnType(XMLType.XSD_STRING);
String sReturn = (String)call.invoke(new Object[]{order});
System.out.println("Transfer Object:"+sReturn);

}catch(ServiceException ex){
ex.printStackTrace();
}catch(MalformedURLException ex){
ex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}

public static void main(String[] args) {


ClientOrder clientOrder = new ClientOrder();
System.out.println("Web Service返回自定义对象");
clientOrder.obtainOrder();
System.out.println("***********************************");
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
24
System.out.println("向Web Service传递自定义对象");
clientOrder.requestOrder();
}
}

编译ClientOrder.java类时,要指定asix的Jar包。

javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientOrder.java

执行

java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientOrder

调用Web Service结果如下:

WSDL2Java

在很多实际WS项目开发过程中,往往对方只提供了WSDL文件,没有提供其他数据,甚至连WS
测试环境也没提供。这样就可以利用WSDL2Java分别生成服务端、客户端代码。

1.生成服务端代码。

cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p WSServer -s
PaymentService.wsdl

说明:-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生
成的Java类的包名。

2.发布到axis1.4服务器。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


25
3.生成客户端代码。

cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p WSClient PaymentService.wsdl

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


26
Web Service For EBS11i
在EBS11i中从事Web Service开发,有多种途径。

1.通过使用第三方的Web Service组件来实现。如:Axis。

2.通过Oracle Database数据端实现。

3.通过Oracle XML Gateway。

Axis1.4 for EBS11i

业务背景:第三方系统通过调用Oracle EBS Web Service接口获取相应的数据。如:AP发票。

Oracle Callin WebService

Callin WebService:将PL SQL程序发布成Web Service,供第三系统调用。也许你会感觉奇怪。


既然有PL SQL程序,直接授权给第三方系统使用不是更快。当然如果是单一的系统环境,很容
易做到这一点。可现实的问题在于,跨地域的异构系统,环境非常复杂。很少有人直接将Oracle
数据库暴露到公网上的。这也是Web Service流行的原因所在。

在Oracle EBS环境中,还支持Web PL/SQL。即将PL SQL程序发布成Http Web形式,以供第三方系统


使用。离本文主题较远,点到为止。

Oracle Callout WebService

Callout WebService:抛开EBS应用层环境,单纯从Oracle Database来调用外部Web Service资源。


即将Oracle Database当成一个Web Service客户端。
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
27
Download Jar Files

尽管Oracle10开始,已经内置SYS.UTL_DBWS包,但相应的Jar包却没有默认安装好。

下载Jar包:http:
//download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callo
ut-utility-10131.zip

解压dbws-callout-utility-10131.zip包。

Load Jar Files

根据数据库的版本,将相应的Jra包上传到Oracle数据库服务器$ORACLE_HOME/sqlj/lib目录

如:Oracle Database 10.2.0.3.0 选择dbwsclientdb102.jar dbwsclientws.jar两个包。

1.由于SYS.UTL_DBWS包使用是JAVA,因此将JAVA_POOL设置大一些。

SQL> alter system set shared_pool_size=500M scope=both;


SQL> alter system set java_pool_size=100M scope=both;
SQL> shutdown immediate;
SQL> startup

2.载入Oracle数据库

# cd $ORACLE_HOME/sqlj/lib
# loadjava -u sys/apps -r -v -f -s -grant public -genmissing dbwsclientws.jar
# loadjava -u sys/apps -r -v -f -s -grant public -genmissing dbwsclientdb102.jar

Permission

以sys用户登陆Oracle,给apps用户授权

execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxySet','write')
;
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxyHost',
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
28
'write');
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxyPort',
'write');
execute dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission',
'accessClassInPackage.sun.util.calendar','');
execute
dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission','getClassLoader','');
execute
dbms_java.grant_permission('APPS','SYS:java.net.SocketPermission','*','connect,resolve');
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','*','read,write');
execute
dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission','setFactory','');

Create WebService Callout Package

1.首先得创建一个Web Service外部服务,以供Oracle调用。本例使用前面AXIS
CusCalculatorService例子。WSDL见附件:CusCalculatorService.wsdl

2.创建Package,调用WebService.

create or replace package cux_invoke_ws as


--author:jarwang
--since:April-5-2011
function test(i number, j number) return number;
end cux_invoke_ws;
create or replace package body cux_invoke_ws as
function test(i number, j number) return number is
l_service SYS.UTL_DBWS.service;
l_call SYS.UTL_DBWS.call;
l_result ANYDATA;
l_wsdl_url VARCHAR2(32767);
l_namespace VARCHAR2(32767);
l_service_qname SYS.UTL_DBWS.qname;
l_port_qname SYS.UTL_DBWS.qname;
l_operation_qname SYS.UTL_DBWS.qname;
l_input_params SYS.UTL_DBWS.anydata_list;
BEGIN
l_wsdl_url := 'http://192.168.1.101:8080/axis/services/CusCalculatorService?wsdl';
l_namespace := 'http://192.168.1.101:8080/axis/services/CusCalculatorService';
--wsdl service name
l_service_qname := SYS.UTL_DBWS.to_qname(l_namespace,'CusCalculatorService');
--调用哪个方法

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


29
l_operation_qname := SYS.UTL_DBWS.to_qname(l_namespace, 'add');

l_service := SYS.UTL_DBWS.create_service(wsdl_document_location =>


URIFACTORY.getURI(l_wsdl_url),
service_name => l_service_qname);

l_call := SYS.UTL_DBWS.create_call(service_handle => l_service,


port_name => l_port_qname,--l_port_qname为null即可,无须赋值
operation_name => l_operation_qname
);
--传入的参数
l_input_params(0) := ANYDATA.CONVERTNUMBER(i);
l_input_params(1) := ANYdATA.CONVERTNUMBER(j);
l_result := SYS.UTL_DBWS.invoke(call_handle => l_call,
input_params => l_input_params);

SYS.UTL_DBWS.release_call(call_handle => l_call);


SYS.UTL_DBWS.release_service(service_handle => l_service);

RETURN ANYDATA.AccessNumber(l_result);
end;
end cux_invoke_ws;

3.执行结果:

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


30
Web Service For R12
本文基于ORACLE EBS12.0.4

PLSQL Deploy WebService

本例实现通过OC4J将PL/SQL Package发布为WebService,以供第三方系统使用。

Create the Package

创建数据库Package:CUX_INVOICE_WS

Create the WebService

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


31
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
32
这一步有点慢。

点击完成。

Deploy the WebService

Integration Repository

在R12中,EBS已经高度集成了Web Service。

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


33
添加职责:Integration Repository

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


34
Oracle XML Gateway

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


35
Other Notes
Oracle EBS-11i 开发笔记:http://www.itpub.net/thread-1133804-1-1.html

Oracle EBS-11i 表结构、API接口笔记:http://www.itpub.net/thread-1265230-1-1.html

Oracle EBS-11i OAF开发笔记:http://www.itpub.net/thread-1236269-1-1.html

Oracle EBS-11i Workflow与JBoss jBPM开发笔记:http://www.itpub.net/thread-1245869-1-1.html

Oracle EBS-11i OM-扩展开发:http://www.itpub.net/thread-1154690-1-1.html

Oracle EBS-11i WEB ADI开发笔记(抽丝拨茧篇):http://www.itpub.net/thread-1225495-1-1.html

Oracle EBS-11i 多节点安装、克隆等 (32bit):http://www.itpub.net/thread-1228782-1-1.html

Oracle EBS-11i AME模块学习笔记:http://www.itpub.net/thread-1409293-1-1.html

Oracle EBS-报表开发工具之闲碎:

Oracle EBS-11i DBA笔记:http://www.itpub.net/thread-1256323-1-1.html

Oracle EBS-R12 单节点安装、克隆等(64bit):http://www.itpub.net/thread-1129128-1-1.html

Oracle EBS-R12 学习笔记(GL、INV):http://www.itpub.net/thread-1247010-1-1.html

Oracle EBS-R12 OAF开发笔记:http://www.itpub.net/thread-1412731-1-1.html

Oracle EBS-Web Service开发笔记:http://www.itpub.net/thread-1436990-1-1.html

Oracle EBS Advanced Replication10g配置:http://www.itpub.net/thread-1216295-1-1.html

Oracle EBS DataGuard10g配置:http://www.itpub.net/thread-1362805-1-1.html

Oracle EBS Stream10g配置:

Oracle10g OCP学习笔记:http://www.itpub.net/thread-1229073-1-1.html

Oracle10g RAC安装:http://www.itpub.net/thread-1194959-1-1.html

Oracle10g 基于ASM存储的异机恢复:http://www.itpub.net/thread-1208926-1-1.html

PL/SQL操作EXCEL:http://www.itpub.net/thread-1101710-1-1.html

MySQL5开发笔记:http://www.itpub.net/thread-1158177-1-1.html

Redhat系统管理员笔记:http://www.itpub.net/thread-1353773-1-1.html

RHEL5.2内核升级:http://www.itpub.net/thread-1145199-1-1.html

Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang


36

You might also like