Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack...

59
Oracle WebLogic Server 上的高级 Web 务开发

Transcript of Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack...

Page 1: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

Oracle WebLogic Server 上的高级 Web 服

务开发

Page 2: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

上机操作:WebLogic Web 服务

本上机操作将涵盖使用 Oracle WebLogic Server 10.3.4 开发和部署 Web 服务应用

程序的基本知识。在该上机操作中,您将使用预先配置的 WebLogic Server 域,其

中包括一个受管服务器,这个受管服务器还作为该域的管理服务器。您将了解

如何通过 Java 类创建 Web 服务

如何通过 WSDL 创建 Web 服务

如何创建 Web 服务客户端

如何使用 MTOM 传输 SOAP 附件

如何添加 JAX-WS 消息句柄

如何保证 Web 服务安全性

如何使用 SAML 进行身份传播

如何创建数据库 Web 服务

如何创建事务 Web 服务

如何创建可靠的 Web 服务

WLS Web Service — 概述

WebLogic Web 服务根据 Web Services for Java EE 1.2 规范

(http://www.jcp.org/en/jsr/detail?id=109) 实现,该规范定义了在 Java 中实现 Web

服务的标准 Java EE 运行时架构。该规范还描述标准 Java EE Web 服务打包格

式、部署模型和各种运行时服务,WebLogic Web 服务实现了所有这些元素。

该编程模型采用新的 JDK 5.0 元数据批注特性(详见

http://java.sun.com/developer/technicalArticles/releases/j2se15/),您可以在其中

创建一个带批注的 Java 文件,然后使用 Ant 任务将文件编译为 Java 类,并生成所

有相关构件。Java Web Service (JWS) 批注文件是 Web 服务的核心。它包含决定

Web 服务行为的 Java 代码。JWS 文件是使用批注指定 Web 服务的形式和特征的

普通 Java 类文件。可以在 JWS 文件中使用的 JWS 批注包括 Web Services

Metadata for the Java Platform 规范 (http://www.jcp.org/en/jsr/detail?id=181) 中定

义的标准批注以及一系列其他标准或 WebLogic 特定的批注,具体取决于所创建的

Web 服务的类型。

可使用以下 Oracle IDE 工具构建 Web 服务:

Oracle Jdeveloper — 功能齐备的 Oracle Java IDE,可用于端到端的 Web

服务开发。开发人员可以构建 Java 类或 EJB,将它们作为 Web 服务,自动

部署到 Oracle WebLogic Server 实例,并立即测试正在运行的 Web 服务。

此外,在通过 WSDL 描述创建 Web 服务时,Jdeveloper 还可以提供支持。

JDeveloper 还支持 Ant。您可以用它来构建和运行 Ant 脚本,用以组装客户

端并组装和部署服务。

Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系

列插件,用于简化 WebLogic Web 服务的开发。OEPE 为 WebLogic Web 服

Hands-on Lab:Web Services development and deployment with Oracle WebLogic Server 11g

Page 3: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

务提供了各种开发特性,包括通过 Java 或 WSDL 创建 Web 服务以及通过

WSDL 生成客户端代理构件。

上机操作 1 — 上机操作介绍和第一个 Web 服务

该部分介绍上机操作中使用的材料及其结构。<LabHome> 目录下有两个子文件

夹。<LabHome>\resources 目录下有不同上机操作所需的各种文件。

<LabWorkspace> 目录下包括所有项目,如下表所示。每个上机操作都有两个项

目,分别用于练习和构建解决方案。

表 1 上机操作的组成部分

名称 值

MiddlewareHome /labs/wls1034

WebLogicHome <MiddlewareHome>/wlserver_10.3

LabDomain <WebLogicHome>/domains/wlsWebServiceLab

OEPEHome <MiddlewareHome>/oepe_11gR1PS3/eclipse

LabHome /home/oracle/labs/WS_labs

LabWorkspace <LabHome>/WLS_OEPE_WS

练习项目 HelloWS(作为上机操作练习的一部分而创建)

解决方案项目 HelloWS_solution

包名 com.library.ws

稍后的上机操作将构建支持图书检索的 Web 服务,以下参数值有效。

用户:

o billiards

o slick

o tfoolery

o clist

o wtell

o itel

书名:

o A brief history of time

o A briefer history of time

o The Stand

o Twilight

o Harry Potter and the Chamber of Secrets

任务概述

1 启动带有 OEPE 的 Eclipse

2 浏览上机操作工作区和项目

3 启动 <LabDomain> 中的 WLS 服务器

Page 4: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

4 创建第一个 JAX-WS Web 服务应用程序

5 部署和测试服务

详细说明

在 OEPE 外部启动 WebLogic Server

1.1 使用桌面图标,启动 <LabDomain> 中的 WebLogic Server

1.2 验证服务器正常启动,没有出现任何错误消息

1.3 按 Ctrl + c 组合键关闭服务器

启动带有 OEPE 的 Eclipse

1.4 使用桌面图标启动 Eclipse。

1.5 如果提示您选择工作区,则选择 <LabWorkspace>。

创建新项目

1.12 在 Package Explorer 或 Project Explorer 选项卡中,右键单击并选择 New > Project

1.13 在 New Project 对话框中,依次选择 WebLogic Web Services 和 Web Service

Project,然后单击 Next。WebLogic Web 服务项目只不过是针对 WebLogic Web 服务

项目预先配置了 facet 的动态 Web 项目。

Page 5: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

1.14 在 New Web Services Project 对话框中输入表 1 中指定的项目名称。如果 Target

Runtime 和 Configuration 下拉列表中没有 11g R1 PS3 选项,请单击 New Runtime

按钮。

Page 6: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

1.15 在 New Server Runtime Environment 对话框中,选择 select Oracle WebLogic

Server 11gR1PS3 并单击 Next 按钮。

Page 7: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

1.16 输入表 1 中的 <WebLogicHome>,或单击 Browse 按钮浏览到 WebLogic Home

目录和 JDK 目录,然后单击 Finish 按钮。

Page 8: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

1.17 单击 Finish 创建新的 Web服务项目。

如果出现 Open Associated Perspective 对话框,请单击 Yes。

注意:您也可以通过项目属性创建一个运行时。

在 OEPE 内启动 WebLogic Server

1.18 在 Server 选项卡中,双击实例

1.19 验证 Overview 面板中的详细信息。相关域名应与 <LabDomain> 相一致

1.20 在 Server 选项卡中,右键单击并选择 Start。

1.21 在 Console 选项卡中,检查是否有错误消息。最一行显示为: <Aug 18, 2010 9:25:28 AM PDT> <Notice> <WebLogicServer> <BEA-000360>

<Server started in RUNNING mode>

1.22 在 Server 选项卡中,检查状态是否为: [Started, Synchronized]

1.23 在 Server 选项卡中,右键单击并选择 Stop

Page 9: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

添加 Java 类

1.24 在 Project Explorer 中,选择新添加的项目并导航至 src 包。

1.25 选择 src 包,右键单击并选择 New > Package。

输入表 1 中的包名并单击 Finish。

1.26 选择新添加的包,右键单击并选择 New > WLS Web Service。

输入包名 (com.library.ws) 和类名 (HelloWS),然后单击 Finish。

修改生成的类

1.27 修改生成的 hello 方法,使之类似于:

public String sayHello(String s) {

String result = “hello”;

if ( s == null || s.isEmpty()) {

return result + “ unknown!”;

}

return result + “ “ + s;

}

1.28 新类如下所示: package com.library.ws;

import javax.jws.*;

@WebService public class HelloWS {

@WebMethod

Page 10: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

public String sayHello( String s) {

String result = “hello”;

if (s == null || s.isEmpty()) {

return result + “ unknown”;

}

return result + “ “ + s;

}

}

如果从 PDF 文件中复制/粘贴内容,则引号可能无法正确转换,可能需要重新输入以避免

编译错误。

1.29

使用保存 ( ) 按钮加以保存。

测试 Web 服务

1.30 在 HelloWS.java 编辑器窗格中,单击任意位置(选中窗格),右键单击并选择 Run

As > Run on Server。

1.31 在 Run on Server 对话框中,选择已有服务器(如果需要),然后选择 Finish。

注意:随后,应用程序将被部署到运行中的服务器上并显示 WebLogic Test Client 选项

卡。

1.32 在 string arg0 对话框中输入一些文本,然后单击 sayHello 按钮。

1.33 选项卡将显示执行 Web 服务的结果。

注意:您可能需要滚动窗口才能看到整个结果。

Page 11: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

1.34 选择 Server 选项卡,选择服务器,右键单击并选择 Stop。

1.35 在 Project Explorer 选项卡中,选择 HelloWS 项目,右键单击并选择 Close Project。

上机操作 2 — 通过 Java 创建 JAX-WS Web 服务

WebLogic Server、JAX-WS 2.0 和带有 OEPE 插件的 Eclipse 可显著简化创建、部署

和管理 Web 服务的过程。在本练习中,我们将创建一个简单的 Web 服务,将其部

署到 WebLogic Server 实例上并测试该 Web 服务。

在本练习结束时,您应该能够:

创建一个基于批注的 Web 服务

从 Eclipse 将应用程序部署到 WebLogic Server

在 Eclipse 中测试新 Web 服务

表 2 第 2 课 Web 服务设计信息

元素 值

练习项目 BottomUP

解决方案项目 BottomUp_solution

包前缀 com.library.ws

Page 12: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

任务概述

1 启动带有 OEPE 的 Eclipse

2 添加 Java 类

3 修改生成的类

4 测试 Web 服务

详细说明

启动带有 OEPE 的 Eclipse

2.1 如果尚未运行 Eclipse,则使用桌面图标启动它

2.2 如果提示您选择工作区,则选择 <LabWorkspace>。

确保已选中 Use this as the default checkbox 并单击 OK。

打开一个项目,导入 java 归档

2.3 在 Package Explorer 选项卡中,选择 BottomUp 文件夹

2.4 选择项目根目录,导航至 WebContent>WEB-INF>lib。

2.5

2.6

2.7

2.8 验证 lib 文件夹中是否包含 support.jar。如果没有,则建议您将该 jar 文件从文件系统拖

放到该文件夹中,请勿使用 Import… 命令。support.jar 文件位于 <LabHome>/resources

目录下。

修改 BQResult,添加无参数构造函数和缺少的 setter 方法

2.9 导航至 BQResult.java 方法并双击以打开类。

2.10 验证 BQResult( String…_) 前面是否存在无参数的构造函数。该构造函数如下所示:

public BQResult() {

init();

}

2.11 添加缺少的 setter 方法。Eclipse 提供了一种在 java 类中添加 setter 方法的快捷操作。

在类中的任意位置右键单击

Page 13: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

2.12 单击 Select Setters 按钮,然后单击 OK。

或者,输入以下 setter 方法: public void setBook(Book book) { this.book = book; }

public void setUserName(String userName) {this.userName =

userName; }

public void setUId(int id) { this.uId = id; }

public void setError(String error) { this.error =

error; }

2.13 保存您的工作。

Web 服务支持 Book Query 类

2.14 导航至 BookQuery.java

注意:带有 OEPE 的 Eclipse未提供属性编辑器,因此必须手动添加和维护批注。您可

Page 14: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

以使用常规的“Control + 空格”组合键在源代码中添加批注。

2.15 定位到类定义并将该类装饰为 WebService,指定服务名称和目标名称空间,如下所

示:

@WebService (serviceName ="BookQueryService",

targetNamespace="http://www.library.com/" )

为类添加 @WebService 批注之后,您可以使用 WebLogic Web Service Annotation 面

板设置任何属性的值。任何更改都将与源代码同步。

2.16 定位到 getBookDetails 方法。

使用 @WebMethod 装饰类,确保提供了正确的方法名称。

@WebMethod (operationName = "BookQuery")

2.17 使用 WebResult 批注装饰类,记住指定适当的结果名称。您的批注应如下所示:

@WebResult(name = "BookResult")

2.18 验证已经使用 WebParam 批注装饰了所有参数。批注应如下所示:

public BQResult getBookDetails (

@WebParam(name="UserName")String uName,

@WebParam(name="Title")String title,

@WebParam(name="Isbn")String ISBN)

测试带批注的基于 POJO 的 Web 服务

2.19 在 Project Explorer 窗格中,选择 BookQuery.java 文件,右键单击并选择 Run As >

Run on Server。

注意:如果提示保存所有源代码。

Page 15: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

2.20 在 Run on Server 对话框中,选择之前添加的服务器并单击 Finish。

如果成功,则会显示 WebLogic Test Client。

2.21 在设计部分输入适当的值并测试新添加的 BookQuery。注意参数名称和操作。它们是否

与您的预期相符?

2.22 检查结果,确认查询中的结果名称是否与预期相符?

Page 16: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化
Page 17: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

上机操作 3 — 通过 WSDL 创建 JAX-WS Web 服务

Oracle Enterprise Pack for Eclipse (OEPE) 提供一组功能,用来通过已有 WSDL 生成

Web 服务以及生成基于 JAX-WS 2.x 的框架实现。在这些练习中,我们将探索该功

能,并使用它创建基于已有 WSDL 合约的 Web 服务定义。

在许多情况下,我们都必须扩展已有类,以便将它们的项目作为 Web 服务功能。

在这些情况中,OEPE 可利用 JAX-WS 2.x 批注将 Java 功能作为 Web 服务公开,

并维持对名称空间、参数、方法和服务名称的控制。

本练习的目标是让您能够通过基于 WSDL 的合约轻而易举地创建 Web 服务。

在本练习中,您将了解:

通过已有 WSDL 创建 Web 服务

指定复杂的 Web 服务返回类型

通过批注指定 Web 服务的特性

表 3 第 3 课 Web 服务设计信息

元素 值

练习项目 TopDown

解决方案项目 TopDown_solution

包前缀 com.library.ws

概述说明

1 启动带有 OEPE 的 Eclipse

2 通过 WSDL 生成 Web 服务

3 完成生成 Web 服务的实现

4 测试生成的 Web 服务

详细说明

启动带有 OEPE 的 Eclipse

3.1 使用桌面图标启动 Eclipse。

3.2 选择 Server 选项卡并选择 Oracle WebLogic Server 实例,右键单击并选择 Start。

注意:如果已经使用桌面快捷方式启动了 WLS,则不需要再次启动。

Page 18: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

打开一个项目,导入 java 归档

3.3 在 Package Explorer 选项卡中,选择 TopDown 文件夹。

3.4 选择项目根目录,导航至 WebContent>WEB-INF>lib。

3.5

3.6

3.7 验证 lib 文件夹中包含 support.jar。如果没有,则建议您将该 jar 文件从文件系统拖放到

该文件夹中,请勿使用 Import… 命令。support.jar 文件位于 <LabHome>/resources 目录

下。

通过 WSDL 生成 Web 服务

3.8 在 Project Explorer 中,导航至 BottomUp\WSDL

3.9 选择 libraryCheckoutService.wsdl,右键单击并选择 WebLogic Web Services >

Generate Web Service。

3.10 在生成菜单中,根据设计表的定义指定 Java 包,然后单击 Finish。

完成生成 Web 服务的实现

3.11 如果成功,则指定包中会生成一个新的 java 基准实现。此外,还应在 Java

Resources>lib>Web App Libraries 下创建一个 jar 文件

(libraryCheckoutService_wsdl.jar)。该文件包含 WSDL 文件外部的所有 JAX-WS 构件。

3.12 在编辑器中打开 java 类

(libraryCheckoutService_libraryCheckoutPortImpl.java)。

3.13 导航至 exists 方法。注意它的返回值是 0。

注意:在添加代码时,您可以使用 [ctrl] + shift + O 或单击快速修复图标 ( ) 来纠正或

添加所需导入。

根据以下要求修改方法

A. 根据设计表的描述实例化一个新的 QuerySupport 对象实例。

B. 使用 exists 方法确定图书是否存在并返回图书 id。

C. 错误时返回 -1。

您的代码应如下所示: public int exists (String name) {

if ( name == null || name.length() == 0)

return -1;

Page 19: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

QuerySupport qs = new QuerySupport();

Book b = qs.exists(name);

if ( b == null)

return -1;

return b.getId();

}

3.14 导航至 checkout 方法,注意它的返回代码为 0。

根据以下要求修改方法

A. 根据设计表的描述实例化一个新的 UserSupport 实例。使用该对象验证输入的

用户名,如果未知则返回 -1。

B. 根据设计表的描述实例化一个 ReservationSupport 实例。使用该对象验证输

入的图书 id,如果出错则返回 -2。

C. 返回最终的预留 id。

新的代码应如下所示:

public int checkout(int bookId, String username) {

if ( bookId < 1 || username == null || username.length() ==

0 ) {

return -1; }

UserSupport us = new UserSupport();

User u = us.find(username);

if ( u == null) {

return -2; }

ReservationSupport rs = new ReservationSupport();

int rId = rs.reserve(bookId, u.getId());

if (rId < 1)

return -2;

return rId;

}

测试生成的 Web 服务

3.15 在 Project Explorer 中,选择 com.library.ws 中新生成的类 libraryCheckoutServer…。

3.16 右键单击并选择 Run As > Run on Server

3.17 在 Run On Server 对话框中,选择 Oracle WebLogic Server … 并单击 Finish。

随后,应用程序将被部署到服务器上并显示 WebLogic Test Client。

Page 20: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

3.18 在 exists 选项中,输入设计部分中的名称的一部分,例如 brief。按下适当的按钮,在本

例中为 exists 按钮。

3.19 检查结果,返回的图书 id 是什么?

提示:设计部分从 1 开始按 ID 顺序列出了所有图书。

3.20 使用重新调用按钮返回到客户端操作页面。输入图书 id 和提供的用户名之一。练习签出

操作。为操作返回的签出 id 是什么?

上机操作 — 通过 WSDL 创建 JAX-WS 客户端

Web 服务在没有客户端应用程序的情况下使用受限。客户端有各种形式,既可以

使用各种方式编写,也可以使用各种语言编写。

在这些练习中,我们将探索如何使用工具生成与 Web 服务相连接并与之交互所需

的所有客户端类,以访问已有 Web 服务。

在本练习中,您将了解:

配置命令行环境

生成一系列客户端端点类

使用客户端类访问 Web 服务

Page 21: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

表 4 第 4 课 Web 服务设计信息

元素 值

练习项目 SynchClient

解决方案项目 SynchClient_solution

包前缀 com.library.ws.client, com.library.ws.servlet

任务概述

1 确定目标 WSDL

2 创建客户端 jar

3 完成和测试 JEE 客户端

4 完成和测试 JSE 客户端

详细说明

启动 WebLogic Server

4.1 如果 WebLogic Server 尚未运行 ,则使用桌面快捷方式启动它。

测试带批注的基于 POJO 的 Web 服务

4.2 在 Project Explorer 窗格中,导航至 BottomUp_solution 部分,选择 BookQuery.java

文件,右键单击并选择 Run As > Run on Server。

Page 22: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

4.3 在 Run on Server 对话框中,选择之前添加的服务器并单击 Finish。

如果成功,则会显示 WebLogic Test Client。

4.4 在设计部分输入适当的值并测试新添加的 BookQuery。注意参数名称和操作。它们是

否与您的预期相符?

4.5 检查结果。

Page 23: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

通过 WSDL 生成 Web 服务代理

4.6 在 Project Explorer 中,导航至 SynchClient 项目并找到 SynchClient\WSDL

4.7 选择 BookQueryService.wsdl,右键单击并选择 WebLogic Web Services >

Generate Web Service Client。

4.8 接受默认值并单击 Finish。

4.9 验证 BookQueryService.wsdl.jar 已经添加到 Java Resources\Libraries\Web App

Libraries & WebContent\WEB-INF\lib) 文件夹中

完成 JEE 客户端

4.10 导航至 src>com.library.ws.servlet>

BookQueryServiceClientServlet.java 中的 main 方法

注意:该类已经完成了一部分。

4.11 更新 main 方法:

a) 通过 @WebServiceRef 批注注入一个 BookQueryService 实例

b) 使用 BookQueryService 实例通过 BookQueryPort 获取一个 BookQuery。

c) 在 BookQuery 实例中,使用“brief”查询“wtell”用户。

d) 使用 printBookQuery 便捷方法输出返回的 BqResult 对象。

代码应如下所示: public class BookQueryServiceClientServlet extends HttpServlet

{

Page 24: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

private static final long serialVersionUID = 1L;

private static final String CONTENT_TYPE = "text/html;

charset=windows-1252";

@WebServiceRef

private BookQueryService bqs;

/**

* @see HttpServlet#HttpServlet()

*/

public BookQueryServiceClientServlet() {

super();

// TODO Auto-generated constructor stub

}

/**

* @see HttpServlet#doGet(HttpServletRequest request,

HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

BookQuery bqp = bqs.getBookQueryPort();

BqResult bqr = bqp.bookQuery("wtell","brief", null);

String responseMsg;

if ( bqr == null ) {

responseMsg = "Got null from bookQuery!";

} else {

responseMsg= printBookQuery(bqr);

}

response.setContentType(CONTENT_TYPE);

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>WS_ClientServlet</title></head>");

out.println("<body>");

out.println("<p>response :" + responseMsg + ".</p>");

out.println("</body></html>");

out.close();

}

…………………..

}

运行 JEE 客户端

4.12 在 Project Navigation Panel 中选择 Servlet 类,右键单击并选择 Run As > Run On

Server。

4.13 检查应用程序的网页输出。

Page 25: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

完成 JSE 客户端

4.14 导航至 src>com.library.ws.client>

BookQueryServiceClientClient.java 中的 main 方法

注意:该类已经完成了一部分。

4.15 更新 main 方法:

e) 创建一个 BookQueryService 实例

f) 使用 BookQueryService 实例通过 BookQueryPort 获取一个

BookQuery。

g) 在 BookQuery 实例中,使用“brief”查询“wtell”用户。

h) 使用 printBookQuery 便捷方法输出返回的 BqResult 对象。

代码应如下所示: public class BookQueryServiceClient {

public static void main(String[] args) {

BookQueryService bqs = new

BookQueryService(Thread.currentThread().getContextClassLoader().getRe

source("META-INF/wsdls/BookQueryService.wsdl"), new

QName("http://www.library.com/", "BookQueryService"));

BookQuery bqp = bqs.getBookQueryPort();

BqResult bqr = bqp.bookQuery("wtell","brief", null);

if ( bqr == null ) {

System.out.println("Got null from bookQuery!");

} else {

System.out.println("Got " + printBookQuery(bqr));

}

}

……………………

}

运行 JSE 客户端

4.16 选择 main 方法,右键单击并选择 Run As > Java Application。

4.17 在控制台选项卡中查看客户端应用程序的输出。您会看到 NoClassDefFoundError。

4.18 选择 main 方法,右键单击并选择 Run As > Run configurations。

4.19 选择 JRE 和 Source 之间的 Classpath 选项卡

4.20 选择 Bootstrap Entries 下的 WebLogic Systems Libraries,单击 Remove 按钮(在

当前 OEPE 版本的 WLS Web Service 项目中创建 JSE 客户端时需要执行此操作)。然

后单击 Apply 并关闭 Run Configurations 对话框。

4.21 选择 main 方法,右键单击并选择 Run As > Java Application。

4.22 在控制台选项卡中查看客户端应用程序的输出。

4.23 关闭项目。

Page 26: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

上机操作 5 — 添加 JAX-WS 消息句柄

句柄提供了一个极其实用的服务,可允许提前或过后处理 Web 服务请求,而无需

更改底层的 Web 服务。为服务编写的句柄可用于处理服务负载或者消息及其头部

(或两者)。此外还可以为 Web 服务客户端编写句柄,这将提供许多相同的服务

和收益。

本练习的目标是了解如何编写和配置句柄。

在本练习中,您将:

编写一个逻辑 Web 服务句柄,其中将封装一些 Web 服务方法和调用

定义一个句柄链,以添加新句柄

更新 Web 服务,使用 @HandlerChain 批注指定一个句柄

表 5 第 5 课 Web 服务设计信息

元素 值

练习项目 Handlers

解决方案项目 Handlers_solution

包前缀 com.library.ws

任务概述

1 创建一个新的逻辑句柄,并在其中实现

javax.xml.ws.handler.LogicalHandler<LogicalMessageContext>。

2 完成 handleMessage 类

3 使用针对 Web 服务的 XML 文件配置句柄链

4 修改 Web 服务,指定句柄链。

5 测试使用句柄链的 Web 服务。

详细说明

创建一个新的逻辑句柄,并在其中实现

javax.xml.ws.handler.LogicalHandler<LogicalMessageContext>。

5.1 使用 Eclipse 打开 Handlers 项目

5.2 在 Application Navigator 中,选择 com.library.ws 包,然后右键单击并选择 New >

Page 27: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

Class。

5.3 创建一个新的 HWLogicalHandler Java 类。

5.4 为了简化开发,请使用下面提供的代码段替换新建类的内容。

. . .

public class HWLogicalHandler implements

LogicalHandler<LogicalMessageContext> {

public boolean handleMessage(LogicalMessageContext messageContext) {

}

public boolean handleFault(LogicalMessageContext messageContext) {

System.out.println("HWLogicalHandler.handleFault called. with

'"+messageContext+"'.\n");

return true;

}

public void close(MessageContext messageContext) {

System.out.println("HWLogicalHandler.close called. with

'"+messageContext+"'.\n");

}

. . .

}

确保通过 control + shift + O 组织导入,然后选择 ws.handler.MessageContext。

5.5 单击 Save 图标。您可以忽略“This method must return a result of type Boolean”编译

错误。

完成 handleMessage 类

5.6 修改 handleMessage 方法,使用提供的 printTime 方法指示开始处理消息。

您的代码应如下所示: printTime(“handleMessage: ”);

5.7 直接在 printTime 调用下方添加代码,确定它是入站调用还是出站调用。使用含

MESSAGE_OUTBOUND_PROPERTY 消息上下文的 messageContext.get() 方法确定调

用方向。注意,此调用将返回一个 Boolean 值。输出调用方向。

您的代码应如下所示: Boolean outboundProperty =

(Boolean)messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

if (outboundProperty.booleanValue()) {

System.out.println("\nOutbound message:");

} else {

Page 28: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

System.out.println("\nInbound message:");

}

5.8 添加输出消息负载的代码。注意,已为您提供 printSource 方法,它接受一个 Source 对

象实例作为输入。您可以使用以下代码获取该对象: LogicalMessage lm =messageContext.getMessage();

Source payload = lm.getPayload();

您的代码应如下所示: LogicalMessage lm =messageContext.getMessage();

Source payload = lm.getPayload();

printSource(payload);

5.9 完成的代码应如下所示:

package com.library.ws;

import java.util.Set;

import java.util.Collections;

import javax.xml.namespace.QName;

import javax.xml.ws.handler.LogicalHandler;

import javax.xml.ws.handler.MessageContext;

import javax.xml.ws.handler.LogicalMessageContext;

import javax.xml.ws.LogicalMessage;

import javax.xml.transform.Source;

import javax.xml.transform.dom.DOMSource;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

public class HWLogicalHandler implements

LogicalHandler<LogicalMessageContext> {

public Set<QName> getHeaders() {

System.out.println("HWLogicalHandler.getHeanders called.\n");

return Collections.emptySet();

}

public boolean handleMessage(LogicalMessageContext messageContext) {

System.out.println("HWLogicalHandler.handleMessage called. with

'"+messageContext+"'.\n");

Boolean outboundProperty =

(Boolean)messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)

;

if (outboundProperty.booleanValue()) {

System.out.println("\nOutbound message:");

} else {

System.out.println("\nInbound message:");

}

LogicalMessage lm =messageContext.getMessage();

Page 29: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

Source payload = lm.getPayload();

printSource(payload);

System.out.println("** Response: " +

messageContext.getMessage().toString());

return true;

}

public boolean handleFault(LogicalMessageContext messageContext) {

System.out.println("HWLogicalHandler.handleFault called. with

'"+messageContext+"'.\n");

return true;

}

public void close(MessageContext messageContext) {

System.out.println("HWLogicalHandler.close called. with

'"+messageContext+"'.\n");

}

private void printSource(Source payload) {

System.out.println("Payload of message = '"+payload+"'");

if (!(payload instanceof DOMSource)) return;

DOMSource ds = (DOMSource)payload;

printNode(0,ds.getNode() );

}

private void printNode(int depth,Node node) {

if ( node == null) return;

for ( int j = 0; j < depth; j++) System.out.print("\t");

System.out.println("" + node);

NodeList children = node.getChildNodes();

if ( children == null ) return;

for (int i = 0; i < children.getLength(); i++) {

Node child = children.item(i);

printNode(depth+1,child);

}

}

}

使用针对 Web 服务的 XML 文件配置句柄链

5.10 在 com.library.ws 包中,创建一个新的名称为 handler-chain.xml 的 XML 文件,方法

如下:

a. 选择 com.library.ws 包

b. 右键单击并选择 New > Other

c. 在新对话框中选择 XML > XML。

d. 指定名称 handler-chain.xml,完成向导

5.11 您的句柄链应如下所示:

Page 30: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

<?xml version="1.0" encoding="UTF-8" ?>

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">

<handler-chain>

<handler>

<handler-class>com.library.ws.HWLogicalHandler</handler-class>

</handler>

</handler-chain>

</handler-chains>

确保该类名与您创建类的相一致。

修改 Web 服务,指定句柄链

5.12 打开 HelloWS Web 服务。

5.13 使用 HandlerChain 批注装饰类,这需要在之前的部分中指定 handler-chain.xml 文

件。

该批注应如下所示: @HandlerChain(file="handler-chain.xml")

public class HellowWS …

5.14 使用相同的句柄链装饰 BookQuery Web 服务,此步可选。

测试使用句柄链的 Web 服务。

5.15 在 Project Explorer,选择 HelloWS Web 服务,右键单击并选择 Run As > Run on

Server。

5.16 在 WebLogic Test 客户端选项卡中,输入您的参数名称并单击 sayHello。

5.17 检查 Console 选项卡。

确认它是否与以下内容类似。 Inbound message:

Payload of message = 'javax.xml.transform.dom.DOMSource@1e428b2'

[#document:null]

[sayHello:null]

[#text:

]

[arg0:null]

[#text:Oracle]

[#text:

]

** Response:com.sun.xml.ws.handler.LogicalMessageImpl@2bec39

HWLogicalHandler.handleMessage called. with

'com.sun.xml.ws.handler.LogicalMessageContextImpl@1d03ef'.

Outbound message:

Payload of message = 'javax.xml.transform.dom.DOMSource@e37fa6'

[#document:null]

[ns2:sayHelloResponse:null]

[return:null]

[#text:hello Oracle]

** Response:com.sun.xml.ws.handler.LogicalMessageImpl@1d18b8b

Page 31: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

5.18 如果装饰了 BookQuery 服务,请使用 wtell 用户和 brief 重复以上过程。

5.19 在 Console 选项卡中查看输出。

上机操作 6 — 使用 MTOM 处理附件

二进制数据传输在基于 XML 的 SOA 中始终是一项挑战。多用途 Internet 邮件扩

展 (MIME) 和直接 Internet 消息封装 (DIME) 常用于解决此问题。如今,在使用

Web 服务时,可以使用消息传输优化方法 (Message Transmission Optimization

Method) 或者 MTOM 和 XML 二进制优化封装 (XOP) 来实现高效的二进制数据传

本练习的目标是学习如何让 Web 服务和 Web 服务客户端使用 MTOM 和 XOP 高效

传输二进制数据。

在本练习中,您将:

让已有 Web 服务支持 MTOM

扩展已有 Web 服务 java 客户端,以使用 MTOM

表 6 第 6 课 Web 服务设计信息

元素 值

练习项目 MTOMSrvice, MTOMClient

解决方案项目 MTOMService_solution, MTOMClient_solution

包前缀 com.library.ws

任务概述

1 通过 Property Inspector 检查 Web 服务操作

2 为 MTOM 装饰已有 Web 服务

3 更新已有客户端,让它使用支持 MTOM 的 Web 服务

4 测试使用 MTOM 的 Web 服务客户端。

详细说明

检查 MTOM 服务项目

6.1 使用 Eclipse 打开 MTOMService 应用程序

6.2 使用 Project Explorer 导航至 com.library.ws.BookQuery.java 类。

Page 32: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

装饰已有 Web 服务,让它支持 MTOM

6.3 如果 BookQuery.java 类尚未打开,请打开并找到类的开始部分。

6.4 使用阈值 128 添加 @MTOM 批注。您的代码应如下所示: @MTOM(threshold=128)

Public class BookQuery…

在 JEE 客户端中启用 MTOM

6.5 在 MTOM Client 项目中,导航至 src>com.library.ws.servlet>

BookQueryServiceClientServlet.java 中的 main 方法

注意:该类已经完成了一部分,这意味着您应该忽略关于需要公有无参数构造函数的编

译器错误。

6.6 找到以下行 BookQuery bqp = bqs.getBookQueryPort();

对其执行以下更改: BookQuery bqp = bqs.getBookQueryPort(new MTOMFeature());

验证该 import 语句如下所示:import javax.xml.ws.soap.MTOMFeature;

6.7 在以下代码下方 byte[] data = getStoredArtifact("brief.txt");

添加

try { String storeName = bqp.storeRelatedArtifact(data,

"brief2.txt");

System.out.println("Data stored as:"+ storeName);

} catch (Exception e) { System.out.println("Unexpected exception" +

e.getMessage());

}

6.8 在新添加的代码下文,使用以下代码检索存储的文件: String artifact = bqp.returnArtifact("brief2.txt");

System.out.println("artifact:"+ artifact);

运行 JEE 客户端

6.9 在 Project Navigation Panel 中选择 Servlet 类,右键单击并选择 Run As > Run On

Server。如果遇到 404 错误,那么您可能需要部署 MTOM Solution 项目。

6.10 在控制台选项卡中查看客户端应用程序的输出。

在 JSE 客户端中启用 MTOM

6.11 导航至 src>com.library.ws.client> BookQueryServiceClient.java 中的

main 方法

注意:该类已经完成了一部分。

Page 33: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

6.12 找到以下行 BookQuery bqp = bqs.getBookQueryPort();

对其执行以下更改: BookQuery bqp = bqs.getBookQueryPort(new MTOMFeature());

注意,您还需要添加 import 代码 import javax.xml.ws.soap.MTOMFeature;

6.13 在以下代码下方 byte[] data = getStoredArtifact("brief.txt");

添加

try { String storeName = bqp.storeRelatedArtifact(data,

"brief2.txt");

System.out.println("Data stored as:"+ storeName);

} catch (Exception e) { System.out.println("Unexpected exception" +

e.getMessage());

}

6.14 在新添加的代码下面,使用以下代码检索存储的文件: String artifact = bqp.returnArtifact("brief2.txt");

System.out.println("artifact:"+ artifact);

然后,在 BookQuery.java 和 BookQueryServiceClient.java 中将 “ D:/docs/webservicePM... ”

引用替换为 “ /home/oracle/labs/WS_Labs/labHome/resources/ “

运行 JSE 客户端

6.15 在服务器选项卡,双击 WebLogic Server 条目。在生成的属性表中,选中“Ignore

compilation errors when deploying”选项并单击保存。然后,选择 main 方法,右键单击

并选择 Run As > Java Application。

6.16 在控制台选项卡中检查客户端应用程序的输出。您会看到 NoClassDefFoundError。

6.17 选择 main 方法,右键单击并选择 Run As > Run configurations。

6.18 选择 JRE 和 Source 之间的 Classpath 选项卡

6.19 选择 Bootstrap Entries 下的 WebLogic Systems Libraries,单击 Remove 按钮(在

当前 OEPE 版本的 WLS Web Service 项目中创建 JSE 客户端时需要执行此操作)。然

后单击 Apply 并关闭 Run Configurations 对话框。

6.20 选择 main 方法,右键单击并选择 Run As > Java Application。

6.21 在控制台选项卡中检查客户端应用程序的输出。

Page 34: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

6.22 关闭项目。在服务器选项卡,双击服务器并取消部署服务器中的所有项目。

上机操作 8 — 创建 RESTful Web 服务

随着基于 SOAP 的 Web 服务在企业应用程序中日益普及,RESTful Web 服务在

基于 AJAX 的 Web 2.0 应用程序中的使用也更加频繁。REST 通常用于表示精简

和高速的性能。

JAX-WS 不支持用于在 POJO 外部创建 REST 式 Web 服务的编程模型。而您必

须要使用 Provider API。

或者,您也可以使用 JAX-RS API 实现重要的 RESTful Web 服务开发。基于

Jersey(JAX-RS 参考实现)的 REST Web 服务应用程序可部署到 WLS。

在本上机操作中,您将使用 JAX-WS API 而非 JAX-RS API。

表 8 第 8 课 Web 服务设计信息

元素 值

练习项目 REST(待创建)

解决方案项目 REST_solution

包前缀 com.ws.rest

任务概述

1 启动一个新 Eclipse 项目

2 创建 REST 式 JAX-WS Web 服务应用程序

3 部署和测试服务

详细说明

在 OEPE 外部启动 WebLogic Server

8.1 使用桌面图标在 <LabDomain> 中启动 WebLogic Server

8.2 验证服务器正常启动,没有出现任何错误消息

8.3 按 Ctrl + c 组合键关闭服务器

Page 35: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

启动带有 OEPE 的 Eclipse

8.4 使用桌面图标启动 Eclipse。

8.5 如果提示您选择工作区,则选择 <LabWorkspace>。

创建新项目

8.6 在 Package Explorer 选项卡中,右键单击并选择 New > Project

8.7 在 New Project 对话框中,选择 WebLogic Web Services 和 Web Service Project,

然后选择 Next。

8.8 在 New Web Services Project 中,输入表 8 中指定的项目名称,然后单击 Target

Runtime 下拉列表旁的 New。

8.9 在 New Server Runtime Environment 对话框中,选择 Oracle WebLogic Server

11gR1 并单击 Next。

8.10 输入表 8 中的 <WebLogicHome>,或者使用 Browse 按钮浏览到 WebLogic Home 目

录,然后单击 Finish。

8.11 单击 Finish 按钮创建新的 Web服务项目。

如果出现 Open Associated Perspective 对话框,请单击 Yes。

注意:您也可以通过项目属性创建一个运行时。

添加 Java 类

8.12 在 Project Explorer 中,选择新添加的项目并导航至 src 包。

8.13 选择 src 包,右键单击并选择 New > Package。

输入表 1 中的包名并单击 Finish。

8.14 选择新添加的包,右键单击并选择 New > WLS Web Service。

输入包名 (com.ws.rest) 和类名 (HelloRest),然后单击 Finish。

修改生成的类

8.15 导入所有需要的类和接口:

import java.io.ByteArrayInputStream;

import java.util.StringTokenizer;

Page 36: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

import javax.annotation.Resource;

import javax.xml.transform.Source;

import javax.xml.transform.stream.StreamSource;

import javax.xml.ws.Provider;

import javax.xml.ws.WebServiceContext;

import javax.xml.ws.WebServiceProvider;

import javax.xml.ws.handler.MessageContext;

import javax.xml.ws.http.HTTPException;

import javax.xml.ws.http.HTTPBinding;

import javax.xml.ws.BindingType;….

8.16 使用 @WebServiceProvider 和 @Bindingtype 批注装饰生成的类定义,替换默认生成的

@webservice 批注。该类还需要实现 Provider<Source> 接口:

@WebServiceProvider(

targetNamespace="http://example.org",

serviceName = "HelloRestService")

@BindingType(value = HTTPBinding.HTTP_BINDING)

public class HelloRest implements Provider<Source> {

….

8.17 通过 @ Resource 批注注入 WebServiceContext 对象: @Resource(type=Object.class)

protected WebServiceContext wsContext;

8.18 实现 invoke() 方法,检查 queryString 并生成响应消息: public Source invoke(Source source) {

try {

MessageContext messageContext =

wsContext.getMessageContext();

String query =

(String)messageContext.get(MessageContext.QUERY_STRING);

if (query != null && query.contains("name=")) {

return createSource(query);

} else {

System.err.println("Query String = "+query);

throw new HTTPException(404);

}

} catch(Exception e) {

e.printStackTrace();

throw new HTTPException(500);

}

}

8.19 添加用于解析和创建 xml 消息的 createSource() 帮助器方法: private Source createSource(String str) throws Exception {

StringTokenizer st = new StringTokenizer(str, "=&/");

st.nextToken();

String name = st.nextToken();

String body = "<ns:HelloRest

xmlns:ns=\"http://example.org\"><greeting>"

Page 37: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

+"hello " + name +"</greeting>"+ "</ns:HelloRest>";

return new StreamSource(new

ByteArrayInputStream(body.getBytes()));

}

8.20 完成后的代码应如下所示: package com.ws.rest;

import java.io.ByteArrayInputStream;

import java.util.StringTokenizer;

import javax.annotation.Resource;

import javax.xml.transform.Source;

import javax.xml.transform.stream.StreamSource;

import javax.xml.ws.Provider;

import javax.xml.ws.WebServiceContext;

import javax.xml.ws.WebServiceProvider;

import javax.xml.ws.handler.MessageContext;

import javax.xml.ws.http.HTTPException;

import javax.xml.ws.http.HTTPBinding;

import javax.xml.ws.BindingType;

/**

* Example request

url:http://localhost:7001/REST/HelloRestService?name=oracle

*/

@WebServiceProvider(

targetNamespace="http://example.org",

serviceName = "HelloRestService")

@BindingType(value = HTTPBinding.HTTP_BINDING)

public class HelloRest implements Provider<Source> {

@Resource(type=Object.class)

protected WebServiceContext wsContext;

public Source invoke(Source source) {

try {

MessageContext messageContext =

wsContext.getMessageContext();

String query =

(String)messageContext.get(MessageContext.QUERY_STRING);

if (query != null && query.contains("name=")) {

return createSource(query);

} else {

System.err.println("Query String = "+query);

throw new HTTPException(404);

}

} catch(Exception e) {

e.printStackTrace();

throw new HTTPException(500);

}

}

private Source createSource(String str) throws Exception {

StringTokenizer st = new StringTokenizer(str, "=&/");

Page 38: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

st.nextToken();

String name = st.nextToken();

String body = "<ns:HelloRest

xmlns:ns=\"http://example.org\"><greeting>"

+"hello " + name +"</greeting>"+ "</ns:HelloRest>";

return new StreamSource(new

ByteArrayInputStream(body.getBytes()));

}

}

8.21

使用保存 ( ) 按钮保存您的工作。

测试 Web 服务

8.22 在 HelloRest.java 编辑器窗格中,单击任意位置(以选择窗格),右键单击并选择

Run As > Run on Server。

8.23 在 Run on Server 对话框中,选择已有服务器(如果需要),然后选择 Finish。

8.24 您将在 console 选项卡中看到错误消息。这与不支持 RESTful Web 服务的通用测试客户

端 (UTC) 相关,并且可被忽略。

8.25 打开 Web 浏览器并输入以下 URL 进行测试:

http://localhost:7001/REST/HelloRestService?name=oracle

8.26 验证响应消息。

8.27 部署解决方案项目 (REST_solution) 中的 NearbyCity.java 并在浏览器中测试它,此步可

选。

http://localhost:7001/REST_solution/NearbyCityService?lat=32&long=-122

上机操作 9 — 事务 JAX-WS Web 服务

WebLogic Web 服务支持以下规范,因此可与其他外部事务处理系统互操作:

Web Services Atomic Transaction (WS-AtomicTransaction) Versions 1.0, 1.1 和

1.2:http://docs.oasis-open.org/ws-tx/wstx-wsat-1.2-spec-cs-

01/wstx-wsat-1.2-spec-cs-01.html

Page 39: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

Web Services Coordination (WS-Coordination) Versions 1.0、1.1 和 1.2:http://docs.oasis-open.org/ws-tx/wstx-wscoor-1.2-spec-cs-01/wstx-

wscoor-1.2-spec-cs-01.html

这些规范定义了一个可扩展的框架,专用于协调一组参与者之间的分布式活动。如

下图所示,协调器是核心组件,用于管理事务状态(协调上下文),将 Web 服务

以及客户端注册为参与者。

下图展示了两个 WebLogic Server 实例在 Web 服务原子事务上下文中的交互过程。

为简单起见,其中显示了两个 WebLogic Web 服务应用程序。

请注意以下事项:

可以使用本地 JTA 事务管理器在本地 JTA 环境将事务作为下属事务导入或

导出,所有操作均在 Web 服务请求的上下文中完成。

本地 JTA 事务管理器将处理协调上下文的创建和管理。

所有事务完整性管理和恢复处理都将由本地 JTA 事务管理器完成。

要在 Web 服务中启用 Web 服务原子事务:

Page 40: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

从 Java 开始时(自下而上),在 Web 服务端点实现类或方法中添加

@weblogic.wsee.wstx.wsat.Transactional。有关更多信息,请参阅 Using

the @Transactional Annotation in Your JWS File。

从 WSDL 开始时(自上而下),使用 wsdlc 通过已有 WSDL 文件生成一个

Web 服务。在本例中,WSDL 中描述的 WS-AtomicTransaction 策略断言将

执行转发并包含在由 wsdlc 生成的新 Web 服务的 WSDL 文件中。请参阅

Enabling Web Services Atomic Transactions Starting From WSDL。

在部署过程中,使用 WebLogic Server 管理控制台在 Web 服务端点或方法层

面启用和配置 Web 服务原子事务。有关更多信息,请参阅 Configuring Web

Services Atomic Transactions Using the Administration Console。

在本练习中,您将:

使用 @Transactional 批注创建和部署一个事务 JAX-WS 应用程序

构建一个执行全局事务处理的客户端应用程序,以及一个支持 WS-AT 的

Web 服务代码,用于调用远程事务 Web 服务

表 9 第 9 课 Web 服务设计信息

元素 值

练习项目 WSATervice, WSATClient

解决方案项目 WSATService_solution, WSATClient_solution

包前缀 examples.webservices.jaxws.wsat.service,

examples.webservices.jaxws.wsat.client

概述说明

1 更新已有 Web 服务,为其指定事务

2 部署应用程序并检查 WSDL 中的 WS-AT 策略

3 在 Web 服务客户端中启用 WS-AT 以调用事务服务

4 测试客户端应用程序

详细说明

更新已有 Web 服务,为其指定事务

9.1 使用 Eclipse 打开 WSATService 项目。在服务器选项卡,双击 WebLogic Server 并取

消部署(删除)服务器中的所有项目。

9.2 导航至 examples.webservices.jaxws.wsat.service 包并打开

WsatBankTransferService 类。

Page 41: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

9.3 在 @WebService 批注下,使用 @Transactional 批注装饰

WsatBankTransferService 类,让它成为事务类。批注应如下所示: @Transactional(value=Transactional.TransactionFlowType.MANDATORY,

version=weblogic.wsee.wstx.wsat.Transactional.Version.WSAT10)

public class WsatBankTransferService {…

9.4 浏览源代码,理解业务逻辑。从本质上说,它包含一些与数据库表交互的公有方法。它

们将作为事务 Web 服务操作公开。

9.5 确保配置了必要的 JDBC 连接和 DataSources。导航到管理控制台中的 Service/Data

Source 页面(用户名:Weblogic,密码:welcome1)

部署应用程序并检查 WSDL 中的 WS-AT 策略

9.6 在 Project Explorer 中,选择 WsatBankTransferService 类,右键单击并选择 Run

As > Run on Server。选择默认服务器并单击 Finish。

9.7 在 WebLogic Test Client 选项卡中,查看无法测试实现了 Web 服务安全性的服务的错

误消息。

9.8 单击 WLS_UTC 上的 WSDL URL 链接。您将看到 WSAT10 策略断言和引用。

Page 42: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

在 Web 服务客户端中启用 WS-AT 以调用事务服务

9.9 使用 Eclipse 打开 WSATClient 项目。

9.10 导航至 examples.webservices.jaxws.wsat.client 包并打开

WsatBankTransferServlet 类。该 servlet 类用于执行 WsatBankTransfer.jsp 中的用

户命令。

9.11 编辑类,让它在实例化 JAX-WS 端口对象时传递 TransactionFeature 和

AddressingFeature。导航至 getWebService 方法并添加代码,以便在代理中启用 WS-

AT,如下所示。

// Passing the TransactionalFeature to the Client

private WsatBankTransferService getWebService(URL wsdlURL) {

TransactionalFeature feature = new TransactionalFeature();

feature.setFlowType(TransactionFlowType.MANDATORY);

feature.setVersion(Version.WSAT10);

WsatBankTransferService_Service service =

new WsatBankTransferService_Service(wsdlURL,

new QName("http://tempuri.org/", "WsatBankTransferService"));

return service.getWSHttpBindingIService(new

javax.xml.ws.soap.AddressingFeature(), feature);

}

如果您从 PDF 复制和粘贴代码,请注意换行符会被删除并造成编译错误。

9.12 单击 Save 按钮。

9.13 导航至 WebContent 下的 WsatBankTransfer.jsp,右键单击并选择 Run As > Run On

Server。选择默认服务器并单击 Finish。您应该看到

Page 43: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

测试客户端应用程序

9.13 确保 Derby 数据库正常运行。您应该在一个独立的 DOS 命令窗口中看到以下消息。

2010-08-13 17:46:320.555 GMT :Security manager installed using the Basic server

security policy. 2010-08-13 17:46:36.755 GMT :Apache Derby Network Server - 10.6.1.0 - (938214) started and ready to accept connections on port 1527

9.14 该客户端应用程序有一个本地事务和一个远程事务,两者都会更新 Derby 数据库表。事

务上下文会通过 WS-AT 传播给远程 Web 服务。如下图所示,选择 create account 单

选按钮,输入帐户 No 和 Amount,然后单击 Submit 按钮。在屏幕截图中将帐户编号

加 1 以避免唯一性约束冲突。

Page 44: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

9.15 选择 list all account balances 单选按钮,然后单击 Submit 按钮查看新帐户和余额

9.16 选择 transfer money 单选按钮,输入帐户 No 和 Amount,然后单击 Submit 按钮 确保

使用有效的客户编号和数量。

Page 45: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

9.17 选择 list all account balances 单选按钮,然后单击 Submit 按钮查看更新后的帐户和

余额

9.18 关闭浏览器

Page 46: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

上机操作 10 — 可靠的 JAX-WS Web 服务

Web 服务可靠消息传递框架可允许在一个应用服务器上运行的应用程序可靠地调

用在另一个应用服务器上运行的 Web 服务,但两个服务器都需要实现 WS-

ReliableMessaging 规范。可靠性是指能够在软件组件、系统、网络故障的情况下保

证两个 Web 服务之间消息交付。

在本练习中,您将:

使用 @ Policy 批注创建和部署一个可靠的 JAX-WS 应用程序

检查启用消息缓冲所需的 WLS SAF(存储和转发)配置,这是 WS-RM 运

行时所不可缺少的

构建一个客户端应用程序,它将通过异步句柄框架演示异步 WS-RM 消息交

表 10 第 10 课 Web 服务设计信息

元素 值

练习项目 WSRMService, WSRMProxyService, WSRMClient

解决方案项目 WSRMService_solution, WSRMProxyService_solution,

WSRMClient_solution

包前缀 wsrm_jaxws.example.service, wsrm_jaxws.example.client,

wsrm_jaxws.example

概述说明

1 更新已有 Web 服务,为其指定可靠性

2 部署应用程序并检查 WSDL 中的 WS-RM 策略

3 在 Web 服务客户端中启用 WS-RM 以调用可靠服务

4 测试客户端应用程序

Page 47: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

详细说明

更新已有 Web 服务,为其指定可靠性

10.1 使用 Eclipse 打开 WSRMService 项目。

10.2 导航至 wsrm_jaxws.example.service 包并打开 ReliableEchoServiceImpl

类。

10.3 在 @WebService 批注下,使用 @Policy 批注装饰

ReliableEchoServiceImpl 类,指定类将使用从 weblogic.jar 中加载的标准

策略。批注应如下所示:

@WebService(portName = "ReliableEchoPort",

serviceName = "ReliableEchoService",

targetNamespace = "http://wsrm_jaxws.example/"

)

@Policy(uri="policy:Reliability1.0_1.1")

public class ReliableEchoServiceImpl {

10.4 浏览源代码,理解业务逻辑。从本质上说,它包含一些用于回显输入参数的公有方法。

它们将作为可靠 Web 服务操作公开。

10.5 确保配置了必要的 SAF 和 JMS 连接。转到管理控制台的 Services/Messaging/{JMS

Servers, Store-and-Forward Agents, JMS modules} 页面。它们会在使用

\wlserver_10.3\common\templates\applications\ wls_webservice_jaxws.jar 域模板

扩展域时自动配置。

Page 48: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

部署应用程序并检查 WSDL 中的 WS-RM 策略-{}-

10.6 在 Project Explorer 中,选择 ReliableEchoServiceImpl 类,右键单击并选择

Run As > Run on Server。选择默认服务器并单击 Finish。

10.7 在 WebLogic Test Client 选项卡中,查看错误消息:无法测试支持 Web 服务可信赖的

消息传递服务。

10.8 单击 WLS_UTC 上的 WSDL URL 链接。您将看到 Reliability1.0_1.1 策略断言和引用。

在 Web 服务客户端中启用 WS-RM 以调用事务服务

10.9 打开 WSRMProxyService 项目

10.10 导航至 wsrm_jaxws.example 包并打开 ClientServiceImpl 类。该 JAX-WS

Web 服务将使用自己的代理客户端调用上面创建的服务。可靠代理仅在 WebLogic 上受

支持,而这正是我们使用代理服务的原因所在。

10.11 编辑类,让它在实例化 JAX-WS 端口对象时传递与 WS-RM 相关的特性。转至

initFeatures() 方法,添加代码以便在代理中启用 WS-RM,完成的类应如下所示。请注

Page 49: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

意,代理注入过程将通过 @WebServiceRef 批注完成。

@PostConstruct public void initFeatures() {

String clientId =

"WsrmJaxws_example_Service_Client_AsyncBuffered";

WsrmClientInitFeature rmInitFeature = new

WsrmClientInitFeature(true);

rmInitFeature.setNonBufferedSource(false);

rmInitFeature.setNonBufferedDestination(false);

features.add(rmInitFeature);

Container c =

ContainerResolver.getInstance().getContainer();

ServletContext servletContext =

c.getSPI(ServletContext.class);

AsyncClientTransportFeature asyncFeature =

new AsyncClientTransportFeature(servletContext);

features.add(asyncFeature);

ReliableEchoServiceImplAsyncHandler asyncHandler =new

MyAsyncHandler();

AsyncClientHandlerFeature achf = new

AsyncClientHandlerFeature(asyncHandler);

features.add(achf);

ClientIdentityFeature clientIdFeature = new

ClientIdentityFeature(clientId);

features.add(clientIdFeature);

mPort =

service.getReliableEchoPort((WebServiceFeature[])features.toArray(new

WebServiceFeature[features.size()]));

}

10.12 单击 Save 按钮。

10.13 浏览代码,了解如何定义和注册异步句柄。

private class MyAsyncHandler

implements ReliableEchoServiceImplAsyncHandler {

public void onEchoResponse(Response<EchoResponse>

echoResponseResponse) {

System.out.println("testing...................\n\n\n\n");

// Find our saved/persistent request ID in the

persistent context.

Map<String, Serializable> persistentContext =

(Map<String, Serializable>)echoResponseResponse.

Page 50: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

getContext().get(JAXWSProperties.PERSISTENT_CONTEXT);

String requestId =

(String)persistentContext.get("RequestID");

if (requestId == null) {

say("NO RequestID property on

persistentContext for response!!!!");

try {

String response =

echoResponseResponse.get().getReturn();

say("Got uncorrelatable response:" +

response);

} catch (Throwable t) {

say("Got uncorrelatable error:" +

t.toString());

t.printStackTrace();

}

10.14 导航至 ClientServiceImpl 类,右键单击并选择 Run As > Run On Server。选择

默认服务器并单击 Finish。

测试客户端应用程序

10.15 打开 WSRMClient 项目

10.16 导航至 wsrm_jaxws.example.client 包并打开 WsrmJaxwsExampleRequest

类。该 Java SE 客户端通过自己的代理客户端调用上面创建的代理服务,后者又会相应

地调用目标可靠服务。

10.17 右键单击并选择 Run As > Java Application。您应该会看到如下所示的响应消息。

10.18 关闭项目

上机操作 11 — 通过 JAX-WS Web 服务支持身份传播

Page 51: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

消息级安全性指定客户端应用程序和 Web 服务之间的由客户端调用的 SOAP 消息

应采用数字签名还是加密方式,或者同时使用两者。在交换多个 SOAP 消息时,

它还可以指定 Web 服务和客户端之间的共享安全性上下文。您可以使用消息级安

全性来确保:

机密性,通过加密消息部分

完整性,通过数字签名

身份验证,通过要求输入用户名、X.509 或 SAML 令牌

SAML Token Profile 1.1 (http://docs.oasis-open.org/wss/v1.1/wss-v1.1-spec-

os-SAMLTokenProfile.pdf) 是核心 WS-Security 标准的一部分,它指定了如何使用

SAML 断言来实现 Web 服务安全性。WebLogic Server 支持 SAML Token Profile

1.1,包括对 SAML 2.0 和 SAML 1.1 断言的支持。SAML Token Profile 1.1 向后兼

容 SAML Token Profile 1.0。

SAML 令牌可在服务器之间运作。这意味着在一个 WebLogic Server 实例中运行的

客户端应用程序可以调用在另一个 WebLogic Server 实例中运行的 Web 服务。由于

客户端应用程序本身就是一个 Web 服务,因此 Web 安全性运行时将完成所有的

SAML 处理。除这种在两个服务器之间使用以外,您还可以通过 WS-Trust 在独立

客户端中使用 SAML 令牌。

在本练习中,您将:

使用 @ Policy 批注创建和部署一个 JAX-WS 应用程序

检查启用身份验证、消息加密和签名所需的 Web 服务安全性配置,这是

SAML 运行时所不可缺少的

构建一个客户端应用程序,它将通过 SAML Sender Vouches 配置方法演示

身份传播(经过身份验证的用户的身份将通过用户名令牌以 SAML 令牌的

形式传播给目标服务)

表 11 第 11 课 Web 服务设计信息

元素 值

练习项目 SAML20SVPartnerService, SAML20SVProxyService,

SAML20SVClient

解决方案项目 SAML20SVPartnerService_solution,

SAML20SVProxyService_solution, SAML20SVClient_solution

包前缀 examples.webservices.saml.saml20sv

概述说明

1 更新已有 Web 服务,为其指定 SAML Sender Vouches 策略

2 部署应用程序并检查 WSDL 中的 SAML Sender Vouches 策略

Page 52: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

3 在 Web 服务客户端中启用 SAML Sender Vouches 以调用目标服务

4 测试客户端应用程序

详细说明

更新已有 Web 服务,为其指定 SAML Sender Vouches 策略

11.1 使用 Eclipse 打开 SAML20SVPartnerService 项目

11.2 导航至 examples.webservices.saml.saml20sv 包并打开 PartnerService

类。

11.3 在 @WebService 批注上方,使用 @Policies 和 @Policy 批注装饰

PartnerService 类,指定类将使用从 weblogic.jar 中加载的标准策略。此处

的三个策略分别用于实现 SAML 令牌身份验证、消息完整性(通过数字签名)

和消息保护(通过加密)。该批注应如下所示:

@Policies(

{

@Policy(uri = "policy:Wssp1.2-2007-Saml2.0-SenderVouches-

Wss1.1.xml"),

@Policy(uri = "policy:Wssp1.2-2007-SignBody.xml"),

@Policy(uri = "policy:Wssp1.2-2007-EncryptBody.xml")

}

)

@WebService(serviceName = "PartnerService", name = "IPartner",

targetNamespace = "http://www.oracle.com/2008/12/interop")

public class PartnerService{

11.4 浏览源代码,理解业务逻辑。从本质上说,它包含一个用于回显输入参数的公有方法。

它将作为可靠 Web 服务操作公开。此外,checkSamlAttributesFromRequestMessage()

方法演示了如何内省 SAML 令牌中的发送程序设置的自定义 SAML 属性。。

11.5 确保配置了必要的 Web 服务安全性和 SAML 参数。转到管理控制台的

wlsWebServiceLab/Web Service Security 页面,查看域级 Web 服务安全性配置。转

到 Security realm/myrealm/Credential Mappings/PKI 页面,查看用户凭证映射。在

Security realm/myrealm/Providers/Authentication 页面中查看凭证映射配置。转到管

理控制台中的 Security realm/myrealm/Providers/Credential Mapping 页面,查看凭证

映射器配置。所有这些内容均通过 WLST 脚本预先配置。

Page 53: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

部署应用程序并检查 WSDL 中的 SAML Sender Vouches 策略

11.6 在 Project Explorer 中,选择 PartnerService 类,右键单击并选择 Run As >

Run on Server。选择默认服务器并单击 Finish。

11.7 在 WebLogic Test Client 选项卡中,输入一个字符串并单击“Echo”,然后查看错误

消息:无法测试 Web 服务支持安全性的服务。

11.8 单击 WLS_UTC 上的 WSDL URL 链接。您将看到安全性策略断言和引用。

Page 54: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

在 Web 服务客户端中启用 SAML Sender Vouches 以调用目标服务

11.9 打开 SAML20SVProxyService 项目

11.10 导航至 examples.webservices.saml.saml20sv 包并打开 ProxyService 类。该

JAX-WS Web 服务将使用自己的代理客户端调用上面创建的服务。SAML 代理(无需使

用 WS-Trust)仅在 WebLogic 上受支持,而这正是我们使用代理服务的原因所在。

11.11 在 @WebService 批注上方,使用 @Policies 和 @Policy 批注装饰

ProxyService 类,指定类将使用从 weblogic.jar 中加载的标准策略。此处的

三个策略分别用于实现用户名令牌身份验证、消息完整性(通过数字签名)和

消息保护(通过加密)。该批注应如下所示: @Policies(

{

@Policy(uri = "policy:Wssp1.2-2007-Wss1.1-UsernameToken-Plain-

EncryptedKey-Basic128.xml"),

@Policy(uri = "policy:Wssp1.2-2007-SignBody.xml"),

@Policy(uri = "policy:Wssp1.2-2007-EncryptBody.xml")

Page 55: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

}

)

@WebService(serviceName = "ProxyService", name = "IProxy",

targetNamespace = "http://www.oracle.com/2008/12/interop")

public class ProxyService{

11.12 单击 Save 按钮。

11.13 浏览代码,了解如何在 JAX-WS BindingProvider 上下文中设置凭证提供程序。

try{

PartnerService service =

new PartnerService(new URL(partenerWsdlURL),

new QName("http://www.oracle.com/2008/12/interop",

"PartnerService"));

IPartner port = service.getIPartnerPort();

BindingProvider provider = (BindingProvider) port;

Map context = provider.getRequestContext();

context.put(WLStub.SAML_ATTRIBUTE_ONLY, "True");

context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,

"http://localhost:7001/partnerservice/partnerservice");

List credProviders = buildCredentialProviderList();

context.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST,

credProviders);

String result = port.echo(hello);

return result+" I'm ProxyService Echo!\n";

} catch(Exception ex ){

throw new RuntimeException(ex);

}

11.14 查看代码,了解如何设置自定义 SAML 属性。

private static class MySAMLCredentialProvider1 extends

SAML2CredentialProvider {

public SAMLAttributeStatementData getSAMLAttributeData(Subject

subject) {

System.out.println(" Providing SAML Attributes from

MySAMLCredentialProvider1 for Subject =" + subject);

// There are four types of attributes in this test

SAMLAttributeStatementData attributes = new

SAMLAttributeStatementDataImpl();

String xmlns = "www.oracle.com/webservices/saml/test";

// 1. The attribute without value

SAMLAttributeData attribute1 = new SAMLAttributeDataImpl();

attribute1.setAttributeName("test.no.value.attribute");

// Friendly name is optional.It is set in this example.

Page 56: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

attribute1.setAttributeFriendlyName("Type 1 - No Value");

attribute1.setAttributeNameSpace(xmlns);

attributes.addAttributeInfo(attribute1);

// 2. Static attribute that has static value

SAMLAttributeData attribute2 = new SAMLAttributeDataImpl();

attribute2.setAttributeName("test.static.attribute");

attribute2.setAttributeFriendlyName("Type 2 - Static Attribute");

attribute2.setAttributeNameSpace(xmlns);

attribute2.addAttributeValue("static.attribute.value");

attributes.addAttributeInfo(attribute2);

11.15 导航至 ProxyService 类,右键单击并选择 Run As > Run On Server。选择默认服

务器并单击 Finish。

测试客户端应用程序

11.16 打开 SAML20SVClient 项目

11.17 导航至 examples.webservices.saml.saml20sv 包并打开 EchoClientServlet

类。这个简单的 servlet 通过自己的代理客户端调用上面创建的代理服务,后者又会相应

地调用目标 partner 服务。

11.18 浏览代码,了解如何设置 BST 和 UNT 凭证提供程序,以符合代理服务的安全策略。

private static CredentialProvider getClientBSTCredentialProvider()

throws Exception {

InputStream clientKeyInputStream =

EchoClientServlet.class.getResourceAsStream("/Alice.prv");

InputStream clientCertInputStream =

EchoClientServlet.class.getResourceAsStream("/Alice.cer");

InputStream serverCertInputStream =

EchoClientServlet.class.getResourceAsStream("/Bob.cer");

X509Certificate clientCert =

CertUtils.getCertificate(clientCertInputStream);

PrivateKey clientPrivateKey =

CertUtils.getPKCS8PrivateKey(clientKeyInputStream);

X509Certificate serverCert =

CertUtils.getCertificate(serverCertInputStream);

return new

ClientBSTCredentialProvider(clientCert, clientPrivateKey,

serverCert);

}

private static CredentialProvider

getClientUNTCredentialProvider() throws Exception {

Page 57: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

String username = "Alice";

String password = "ecilA1a!";

return new ClientUNTCredentialProvider(username.getBytes(),

password.getBytes());

}

11.19 右键单击并选择 Run As > Run On Server。选择默认服务器并单击 Finish。您应该会

在嵌入式浏览器中看到以下消息。

.

您可以查看运行 WebLogic Server 的命令窗口,其中显示了如下所示的跟踪消息。

<Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <[SignatureValidationResult :

[status:true] [signature:5rCpLSOmi/Dp/WhoDZF2WV3CZOg=] [keySelectorResult:[KeySelectorResultImpl: [Key:javax.crypto.spec.SecretKeySpec@15c94] [Message:null] [SecurityToken:weblogic.xml.crypto.wss11.internal.enckey.EncryptedKeyToken@1430 2aa]]] [refValidationResults: [ReferenceImpl.ValidateResultImpl: [refURI:#Timestamp_eX9z7AamQMFJQQLS] [status:true] [digestValue:0E30E22A2CBAB6E27F4046458E1F10EE86BAF48E] [unmarshalledDigestValue:0E30E22A2CBAB6E27F4046458E1F10EE86BAF48E]] [ReferenceImpl.ValidateResultImpl: [refURI:#Body_mIVU7ho7V5VVzQry] [status:true] [digestValue:0141CF80B6822BA3B0CEBE4596EEC426122AF9DE] [unmarshalledDigestValue:0141CF80B6822BA3B0CEBE4596EEC426122AF9DE]] [ReferenceImpl.ValidateResultImpl: [refURI:#sigconf_SkB4gPhv1aiUDzZ5] [status:true] [digestValue:F453FFD632F21EC6013D1D3E58109946DF1CBEAB] [unmarshalledDigestValue:F453FFD632F21EC6013D1D3E58109946DF1CBEAB]]]]> <WSEE:15>WSEE[MONITORING[Invocation[DispatchTime=619316840][ExecutionTime=0][Res ponseTime=619316841]]]<WseeBaseOperationRuntimeData.reportInvocation:185> <WSEE:15>set Message called:com.sun.xml.internal.messaging.saaj.soap.ver1_1.Mes sage1_1Impl@1f7571<SoapMessageContext.setMessage:65> <WSEE:15>Parsed header {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-

Page 58: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

wssecurity-secext-1.0.xsd}Security:<name={http://docs.oasis-open.org/wss/2004/0 1/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security> <role=null> <mustUndersta nd=true><SoapMsgHeaders.parseHeaders:202> <WSEE:15>isCompatMSFT set to false<SecurityPolicyBlueprintPlotter.drawPolicyComp atibilityPreference:110> <WSEE:15>policyNamespaceUri is http://docs.oasis-open.org/ws-sx/ws-securitypolic y/200702<SecurityPolicyBlueprintPlotter.drawPolicyCompatibilityPreference:111> <WSEE:15>Inspecting message age ...<SecurityMessageInspector.checkMessage:168> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <*************TIMESTAMP VAL IDATION: >

<Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <created = Mon Aug 16 17:24 :02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <now = Mon Aug 16 17:24:02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <expiry = Mon Aug 16 17:25: 02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <longCreated = 128200464200 0>

<Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <longNow = 1282004642920> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <clockSkew used = 60000> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <clockSkew = 60000> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <clockPrecision = 60000> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <useClockSkew = true> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <clockSynchronized = true>

<Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <maxProcessingDelay = -1> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <TIMESTAMP VALIDATION: >

<Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <created = Mon Aug 16 17:24 :02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <now = Mon Aug 16 17:24:02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <expiry = Mon Aug 16 17:25: 02 PDT 2010> <Aug 16, 2010 5:24:02 PM PDT> <Info> <> <BEA-000000> <clockSkew used = 60000> <WSEE:15> timestamp(maxAgesSecs=60) verified<SecurityMessageInspector.doMessageAge:756> <WSEE:15>Inspecting message authentication identity ...<SecurityMessageInspector

Page 59: Oracle WebLogic Server 上的高级 Web 服 务开发 · 2011. 3. 21. · Oracle Enterprise Pack for Eclipse (OEPE) — 为 Eclipse IDE 平台提供一系 列插件,用于简化

.checkMessage:176> <WSEE:15>Identity is not required.<SecurityMessageInspector.inspectIdentity:804> <WSEE:15>Inspecting signature confirmation ...<SecurityMessageInspector.checkMes sage:187> <WSEE:15>Inspecting signature and encryption ..., request =false<SecurityMessage

11.20 关闭项目