在 Eclipse 中结合 IBM WebSphere Application Server 使用 Validator for WS-Policy

Validator for WS-Policy in Eclipse 是一个插件,可帮助对 WS-Policy 问题进行故障诊断。了解如何使用该插件调试 IBM WebSphere Application Server 使用的一些 WS-Policy 中的问题。此外,了解如何创建自己的架构,将该验证器用于其他 WS-Policy 断言。

Matthew Wilson, 软件工程师,CICS TS Development, IBM

Matthew WilsonMatthew Wilson 是 IBM Hursley 的一名软件工程师,还是 CICS Transaction Server 的 Architecture Enhancements 开发团队的成员。他于 2008 年从南安普顿大学毕业后加入 IBM,他拥有计算机科学分布式系统和网络方向工程学的硕士学位。他参与了 Validator for WS-Policy in Eclipse 的开发,这是一个 Hursley Blue Opportunity 项目。



Katherine Sanders, IBM Software Services for WebSphere, <a href="http://www.ibm.com">IBM</a>

KatherineSandersKatherine Sanders 是一名顾问,供职于位于英国 Hursley 的 IBM Software Group 的 EMEA Laboratory Services。她此前负责开发和测试 WebSphere Application Server 中的 Web 服务功能,尤其关注 WS-Addressing、WS-ReliableMessaging 和 WS-Notification。她从诺丁汉大学获得计算机科学硕士学位。她参与了 Validator for WS-Policy in Eclipse 的开发,这是一个 Hursley Blue Opportunity 项目。


developerWorks 投稿作者

2011 年 10 月 13 日

使用 Validator for WS-Policy in Eclipse

本节阐述如何使用 Validator for WS-Policy in Eclipse 调试无效 WS-Policy 导致的错误。这会使用到本文包含的样例应用程序,还要使用 IBM® Rational® Application Developer 8.0.2 和 IBM WebSphere® Application Server 7.0.0.17。


设置 IBM WebSphere Application Server 和 IBM Rational Application Developer

要识别测试项目错误时将用到的运行时环境,则必须在 IBM Rational Application Developer 中创建一个服务器。这将创建一个从工作台到现有应用服务器安装或服务器配置文件的指针。在本文中,IBM WebSphere Application Server 7.0.0.17 安装将用作样例应用程序的应用服务器。但是,在创建这个服务器之前,还必须创建合适的 Server Runtime Environment 和 IBM WebSphere Application Profile,如果它们还不存在的话。最后,必须启动服务器,准备好安装和启动应用程序。

  1. 使用一个新工作空间中启动 IBM Rational Application Developer 8.0.2。
  2. 关闭 Welcome 页。您现在应该位于 Java™ EE 透视图中。
  3. 创建一个 Server Runtime Environment:选择 Window > Preferences
  4. Server / Runtime Environments > Add
图 1. 添加一个 Server Runtime Environment
添加一个 Server Runtime Environment
  1. 选择 "WebSphere Application Server v7.0" > Next
图 2. 选择 Runtime Environment 的类型
选择 Runtime Environment 的类型
  1. 名称 = "WebSphere Application Server v7.0.0.17",安装目录 = <WAS_HOME>(例如, C:\Program Files\IBM\WebSphere\AppServer)> Finish
图 3. 指定 IBM WebSphere Application Server 安装目录
指定 IBM WebSphere Application Server 安装目录
  1. 创建一个 IBM WebSphere Application Server Profile:选择 Window > Preferences
  2. Server / WebSphere Application Server > Run Profile Management Tool
图 4. 运行 Profile Management Tool
运行 Profile Management Tool
  1. 在打开 Profile Management Tool 之后,单击 Launch Profile Management Tool。
图 5. 启动 Profile Management Tool
启动 Profile Management Tool
  1. 单击 Create...
图 6. 新建一个配置文件
新建一个配置文件
  1. 确保已选中 "Application Server" > Next
图 7. 指定要创建的环境的类型
指定要创建的环境的类型
  1. 确保已选中 "Typical profile creation" > Next
图 8. 选择 Typical profile creation 流程
选择 Typical profile creation 流程
  1. 取消选中 "Enable administrative security" 复选框 > Next。
图 9. 禁用管理安全性
禁用管理安全性
  1. 检查配置文件细节 > Next
图 10. 检查配置文件创建摘要
检查配置文件创建摘要
  1. 配置文件创建后,取消选中 "Launch the First steps console" 复选框 > Finish。
图 11. 完成配置文件创建向导
完成配置文件创建向导
  1. 关闭 Profile Management Tool。
  2. 检查新配置文件现在是否已在底部面板中列出。然后单击 OK 关闭 Preferences 窗口。

创建并启动一个服务器

  1. Servers 选项卡 > 右键单击 > New > Server。
图 12. 新建一个服务器
新建一个服务器
  1. 选择 "WebSphere Application Server v7.0" > Next。
图 13. 选择服务器类型
选择服务器类型
  1. 确保选择刚刚创建的配置文件的名称 > Finish。
图 14. IBM WebSphere Application Server 设置
IBM WebSphere Application Server 设置
  1. Servers 选项卡 > 右键单击 "WebSphere Application Server v7.0.0.17 at localhost" > start。
图 15. 启动服务器
启动服务器

导入并运行样例应用程序

样例应用程序使用了一个 Policy Set,默认情况下,IBM WebSphere Application Server 和 IBM Rational Application Developer 中没有安装它,因此必须先导入它。然后,可以将样例应用程序 EAR 文件导入 IBM Rational Application Developer 工作空间,并在上一节中创建的服务器上启动它。应用程序运行后,就可用于发送一个同步 Web 服务请求。但是,这将产生一个异常,而不是返回一条成功响应消息,因为样例应用程序中的 WS-Policy 是无效的。

  1. 将样例应用程序所需的提供者策略集导入 IBM WebSphere Application Server:选择 Servers 选项卡 > 右键单击 "WebSphere Application Server v7.0.0.17 at localhost" > Administration > Run Administrative Console...
图 16. 运行 Administrative Console
运行 Administrative Console
  1. Administrative Console > Services / Policy Sets / Application Policy Sets > Import... > From default repository...
图 17. 导入 Policy Set
导入 Policy Set
  1. 滚动到页面底部,单击箭头移动到第 2 页。
  2. 选中 "WS-Security default" 旁边的复选框 > OK > Save。
图 18. 选择 WS-Security 默认 Policy Set
选择 WS-Security 默认 Policy Set
  1. 退出并关闭 Administrative Console。
  2. 将样例应用程序所需的提供者策略集导入 IBM Rational Application Developer 并下载本文包含的 WSSecurity default.zip 文件。
  3. 在 Enterprise Explorer 视图中右键单击 > Import > Import...
图 19. 打开导入向导
打开导入向导
  1. Web services / WebSphere Policy Sets > Next
图 20. 导入 Policy Set
导入 Policy Set
  1. 浏览导入的文件 > Finish
图 21. 导入下载的 Policy Set
导入下载的 Policy Set
  1. 导入已破坏的样例应用程序并下载本文包含的 InvalidPolicy.ear 文件。
  2. 右键单击 Enterprise Explorer > Import > EAR File。
图 22. 导入一个 EAR 文件
导入一个 EAR 文件
  1. 浏览您下载的文件,确认目标运行库 = "WebSphere Application Server v7.0.0.17" > Finish
图 23. 导入下载的 EAR 文件
导入下载的 EAR 文件
  1. 注意,使用 IBM Rational Application Developer 附带的默认插件时,样例应用程序的编译没有错误。
图 24. 导入的样例应用程序编译没有错误
导入的样例应用程序编译没有错误
  1. 运行已破坏的样例应用程序并选择 Servers 选项卡 > 右键单击 "WebSphere Application Server v7.0.0.17 at localhost" > Add and Remove...
图 25. 打开 Add and Remove 向导
打开 Add and Remove 向导
  1. 选择 Available 列中的 InvalidPolicy > Add > Finish
图 26. 添加已破坏的样例应用程序
添加已破坏的样例应用程序
  1. 应用程序成功发布后,请注意,服务器状态已经更改为 [Started, Synchronized]。
图 27. 检查服务器状态
检查服务器状态
  1. 打开一个 Web 浏览器,导航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo
  2. 选择 Message Type = Synchronous Echo, Message String = hello > Send Message。一个异常会出现。
图 28. 调用已破坏的样例应用程序 Web 服务
调用已破坏的样例应用程序 Web 服务

分析错误并定位无效 WS-Policy

当 Server Runtime Environment 中出现错误时,错误日志会显示在 IBM Rational Application Developer 中的控制台视图中。在本例中,将有一个错误指出客户端上的 WS-Security 配置中有问题,需要确定客户端是否是使用提供者 WSDL 文档中的 WS-Policy 配置的。

  1. 查看 IBM Rational Application Developer 中的控制台并观察下面的消息:
清单 1. 运行已破坏的样例应用程序后的错误
[23/05/11 14:40:12:906 BST] 0000001f SystemOut     O >> CLIENT: ERROR: SEI Echo EXCEPTION.
[23/05/11 14:40:12:906 BST] 0000001f SystemErr     R javax.xml.ws.WebServiceException:
com.ibm.wsspi.wssecurity.core.SoapSecurityException: CWWSS5400E: algorithm attribute is
required but found:
com.ibm.ws.wssecurity.confimpl.PrivateCommonConfig$AlgorithmConfImpl(algorithm=[null],
type=[null], properties=[{}]).
  1. 注意,生成策略集配置时,客户端上出现了错误:
清单 2. 错误堆栈跟踪
[23/05/11 14:40:12:921 BST] 0000001f SystemErr     R 	at
com.ibm.ws.wspolicy.runtime.handler.ClientWSPolicyHandlerImpl.
generatePolicySetConfigurations(ClientWSPolicyHandlerImpl.java:282)
  1. 注意,Web 服务客户端被配置为使用提供者策略。
  2. 选择 Services 视图 > JAX-WS/Clients/SampleClientSei: {http://com/ibm/was/wssample/sei/echo/}EchoService > Manage Policy Set Attachment...
图 29. 管理客户端 Policy Set 附件
管理客户端 Policy Set 附件
  1. 注意,所有服务都被设置为 "Acquire Provider Policy"。
图 30. 查看每个服务的策略获取
查看每个服务的策略获取
  1. 单击 "Use Provider Policy...",观察是否使用 HTTP GET 从默认 WSDL URL 中获取策略。
图 31. 查看提供者策略 WSDL URL
查看提供者策略 WSDL URL
  1. 定位包含提供者策略的 WSDL 文件并导航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl
  2. 注意,这个 URL 重定向到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService/WEB-INF/wsdl/Echo.wsdl,这是因为正在使用的 WSDL 是提供者 WAR 中的一个已打包的文件(InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl)。
图 32. 定位 Echo.wsdl 文件
定位 Echo.wsdl 文件

安装 Validator for WS-Policy in Eclipse 插件

由于已经确认提供者 WSDL 文档中的 WS-Policy 有问题,但 Eclipse 中的现有验证器没有发现原因所在,因此将安装 Validator for WS-Policy in Eclipse 插件。安装将通过其他 Eclipse 插件使用的标准更新机制来完成。

  1. alphaWorks 下载 VWPE.zip,这个 Zip 文件包含 Validator for WS-Policy in Eclipse 1.0。
  2. 在一个本地目录中解压 VWPE.zip,在指定目录中创建一个本地更新站点。
  3. Help > Install New Software...
  4. 单击 Add...
图 33. 新增一个存储库
新增一个存储库
  1. 单击 Local...,选择前面解压的 VWPE 目录。
图 34. 选择 VWPE 目录
选择 VWPE 目录
  1. 输入 Name VWPE 并单击 OK。
  2. 选择 Validator for WS-Policy in Eclipse 插件并单击 Next。
图 35. 选择要安装的插件
选择要安装的插件
  1. 检查安装细节并单击 Next。
图 36. 检查要安装的项目
检查要安装的项目
  1. 检查并接受许可,单击 Finish。
图 37. 检查许可
检查许可
  1. 单击 OK 忽略安全警告。
图 38. 忽略安全警告
忽略安全警告
  1. 安装完成后,单击 Restart Now 重启带有新插件的 IBM Rational Application Developer。
图 39. 重启 IBM Rational Application Developer
重启 IBM Rational Application Developer

配置 Validator for WS-Policy in Eclipse

要验证是否已经正确安装该插件,则应该检查配置,确保验证器已经启用并且会在 WSDL 文档上运行。

  1. 重启 IBM Rational Application Developer 后,请转到 Window > Preferences。
  2. Validation > 确保 WS-Policy 验证器已经启用("Manual" 和 "Build" 复选框均已选中)。
图 40. 确保已启用 WS-Policy 验证器
确保已启用 WS-Policy 验证器
  1. 单击 "WS-Policy validator" 旁边的 "..." 按钮打开 Settings。
  2. 检查 WS-Policy Validator 是否会在所有扩展名为 wsdl 和 xml 的文件上运行。单击 Cancel。
图 41. 验证器使用的文件类型
验证器使用的文件类型
  1. Validation / WS Policy Validator。注意,这个子页允许使用自定义架构文件。默认情况下,这个架构目录是空的,以便使用插件提供的架构。下面的 “测试架构” 将详细介绍相关内容。
图 42. WS Policy Validator 架构目录
WS Policy Validator 架构目录

验证已破坏的样例应用程序中的无效 WS-Policy

项目中的所有文件都将将获得验证,提供者 WSDL 文档中会出现一个 WS-Policy 错误,此前将该文档标识为客户端配置错误的根源。可以使用一个标记来标识无效的特定 WS-Policy 断言,错误消息会说明有一个断言缺失。可以使用规范和提供者配置作为指导,通过添加缺失的断言来解决这个问题。

图 43. 验证 WS-Policy
验证 WS-Policy
  1. 验证结束时,单击 OK 关闭 Validation Results 对话框。
图 44. 验证结果
验证结果
  1. 注意,会有一个新的 Invalid WS-Policy 错误出现在 Markers 选项卡中。该错误指出 AlgorithmSuite 断言至少必须出现一次。
图 45. Markers 选项卡中的 Invalid WS-Policy 错误
Markers 选项卡中的 Invalid WS-Policy 错误
  1. 双击错误会打开 InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl 文件,并会突出显示相关的行。注意,这是我们前面指出的那个文件。它包含 Web 服务提供者发布的 WS-Policy,客户端正在使用这个提供者策略来配置自己。
  2. 注意,错误位于一个 AsymmetricBinding 断言中。
图 46. 无效 AsymmetricBinding 断言
无效 AsymmetricBinding 断言
  1. 注意 WS-Security Policy 1.2 规范 中的 AsymmetricBinding 断言的语法。正如错误中说明的那样,AlgorithmSuite 是必需的,但它缺少以下内容:
清单 3. AsymmetricBinding 断言语法
<sp:AsymmetricBinding xmlns:sp="..." ... >
 <wsp:Policy xmlns:wsp="...">
 (
 <sp:InitiatorToken>
 <wsp:Policy> ... </wsp:Policy>
</sp:InitiatorToken>
    ) | (
     <sp:InitiatorSignatureToken>
       <wsp:Policy> ... </wsp:Policy>
     </sp:InitiatorSignatureToken>
     <sp:InitiatorEncryptionToken>
       <wsp:Policy> ... </wsp:Policy>
     </sp:InitiatorEncryptionToken>
    )
    (
     <sp:RecipientToken>
       <wsp:Policy> ... </wsp:Policy>
     </sp:RecipientToken>
    ) | (
     <sp:RecipientSignatureToken>
       <wsp:Policy> ... </wsp:Policy>
     </sp:RecipientSignatureToken>
     <sp:RecipientEncryptionToken>
       <wsp:Policy> ... </wsp:Policy>
     </sp:RecipientEncryptionToken>
    )
    <sp:AlgorithmSuite ... => ... </sp:AlgorithmSuite>
    <sp:Layout ... => ... </sp:Layout> ?
    <sp:IncludeTimestamp ... /> ?
    <sp:EncryptBeforeSigning ... /> ?
    <sp:EncryptSignature ... /> ?
    <sp:ProtectTokens ... /> ?
    <sp:OnlySignEntireHeadersAndBody ... /> ?
    ...
  </wsp:Policy>
  ...
</sp:AsymmetricBinding>
  1. 注意 AlgorithmSuite Assertion 的语法:
清单 4. AlgorithmSuite Assertion 的语法
<sp:AlgorithmSuite xmlns:sp="..." ... >
 <wsp:Policy xmlns:wsp="...">
 (<sp:Basic256 ... /> |
 <sp:Basic192 ... /> |
 <sp:Basic128 ... /> |
 <sp:TripleDes ... /> |
 <sp:Basic256Rsa15 ... /> |
 <sp:Basic192Rsa15 ... /> |
 <sp:Basic128Rsa15 ... /> |
 <sp:TripleDesRsa15 ... /> |
 <sp:Basic256Sha256 ... /> |
 <sp:Basic192Sha256 ... /> |
 <sp:Basic128Sha256 ... /> |
 <sp:TripleDesSha256 ... /> |
 <sp:Basic256Sha256Rsa15 ... /> |
 <sp:Basic192Sha256Rsa15 ... /> |
 <sp:Basic128Sha256Rsa15 ... /> |
 <sp:TripleDesSha256Rsa15 ... /> |
 ...)
 <sp:InclusiveC14N ... /> ?
 <sp:SOAPNormalization10 ... /> ?
 <sp:STRTransform10 ... /> ?
 (<sp:XPath10 ... /> |
 <sp:XPathFilter20 ... /> |
 <sp:AbsXPath ... /> |
 ...)?
 ...
</wsp:Policy>
 ...
</sp:AlgorithmSuite>
  1. Servers 选项卡 > 右键单击 "WebSphere Application Server v7.0.0.17 at localhost" > Administration > Run Administrative Console...
  2. Services / Policy sets / Application policy sets > WS-Security default
图 47. WS-Security 的默认策略
WS-Security 的默认策略
  1. 单击 WS-Security
图 48. WS-Security 策略
WS-Security 策略
  1. 单击 Main Policy
图 49. Main policy
Main policy
  1. 单击 Algorithms for asymmetric tokens。注意,提供者正在使用 Basic128Rsa15。
图 50. Algorithms
Algorithms
  1. 退出并关闭 Administrative Console。
  2. 将以下 WS-Policy 断言添加到 Echo.wsdl 中,以便使用 Basic128Rsa15 断言(在 Layout 断言上面的 AsymmetricBinding/Policy 断言中):
清单 5. 样例应用程序的 Algorithm Suite 策略
<ns2:AlgorithmSuite>
 <wsp:Policy>
 <ns2:Basic128Rsa15 />
 </wsp:Policy>
</ns2:AlgorithmSuite>
  1. 保存更改。注意,Invalid WS-Policy 错误消失了。

重新运行修改后的样例应用程序

要使 WS-Policy 更改在客户端配置上生效,必须重启服务器。应用程序重新运行后,会发送另一个 Web 服务请求,这次会收到一条成功响应消息。WS-Security 配置错误不会再出现在控制台日志中。

  1. Servers 选项卡 > 右键单击 "WebSphere Application Server v7.0.0.17 at localhost" > Restart。这可以确保重新创建的是客户端策略集,而不是使用前面的无效配置的缓存副本。
图 51. 重启服务器
重启服务器
  1. 导航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl,确保 WSDL 已经刷新,AlgorithmSuite 断言存在。
  2. 导航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo
  3. 选择 Message Type = Synchronous Echo, Message String = hello > Send Message。
  4. 响应成功返回,字符串 hello 返回。
图 52. 调用修改后的样例应用程序 Web 服务
调用修改后的样例应用程序 Web 服务
  1. 注意,这个错误不再出现在控制台记录中。

总结

样例应用程序在提供者 WSDL 文档中包含无效 WS-Policy。由于客户端被配置为读取 WS-Policy 并使用它配置客户端的 WS-Security 设置,因此 Web 服务调用会失败。

要调试这个失败,请检查控制台中的日志中的错误。日志中显示的一个错误表明问题出现在客户端策略集配置中。客户端被配置为使用来自 WSDL 文档的提供者策略,这意味着 WS-Policy 存在无效的可能性。

安装 Validator for WS-Policy in Eclipse 插件后,要验证项目中的所有文件。唯一的错误出现在提供者的 WSDL 文件中,错误指出缺少一个 AlgorithmSuite 断言。当打开文件时,错误标记也会指出 Assymmetric 绑定断言中缺失 AlgorithmSuite 断言。

为修复此错误,我们添加了与提供者的配置相对应的 AlgortithmSuite 断言。这个插件提供的文档还包含更多 WS-Policy 验证错误示例,并介绍了如何修复这些错误。

提供者的 WSDL 文档中的 WS-Policy 的长度超过 100 行,没有一个标准 Eclipse 验证器能够识别其中的错误。而且,WS-Security Policy 非常复杂,因此手动验证每个断言非常耗时,而且手动验证很容易出错。显然,如果没有 Validator for WS-Policy in Eclipse,这个小错误将花费大量时间和精力才能得以解决。


创建自己的架构

Validator for WS-Policy in Eclipse 由一些现有的架构提供,这些架构可用于支持 IBM WebSphere Application Server 7.0 的所有 WS-Policy 断言。但是,可以通过其他规范使用的用户定义架构来扩展该插件。例如,您可能想在您的 WSDL 中包含一些 WS-Policy 断言,供另一个平台上的端点使用。本节将展示如何为 Validator for WS-Policy in Eclipse 构造一个支持 WS-Eventing 规范 的架构。

WS-Eventing 描述了使用 Web 服务在另一个 Web 服务或应用程序中注册您感兴趣的活动的方法。它描述了允许服务管理其事件相关订阅的订阅管理器。为了表明对 WS-Eventing 的支持,指定了两个 WS-Policy 断言。EventSource 断言用于表明服务接受创建订阅的请求,SubscriptionManager 断言表明服务支持代表其他服务管理订阅。这两个断言的结构都比较简单,因此可以作为展示如何创建架构的简单示例。验证器的架构文件的格式是经过预先设计的,以便从一个正式规范创建架构成为一个简单任务。因此,这种格式主要基于 WS-Security Policy 等 OASIS 规范中使用的语法惯例。但是,验证器的确需要向这个语法信息添加一些额外的元数据并对其结构实施一些限制。架构文件被划分为很多部分,每个部分都以一个位于方括号中的标题开头。

前两个部分关注与规范有关的 XML 命名空间。第一个部分是 [Namespaces],它列示架构中使用的命名空间前缀及其对应的经过限定的命名空间,类似于基本 XML 文档中的 xmlns 属性。注意,与 xmlns 不同,使用的每个命名空间都必须通过其前缀进行声明,并在架构的其余部分通过前缀引用;不支持使用完全限定的断言。对于 WS-Eventing,我们只关心一个命名空间,即 WS-Eventing 命名空间;在规范的 3.5 节 中提供了这个命名空间,它使用了前缀 wse。我们将这部分编码如下:

清单 6. 架构的命名空间部分
[Namespaces]
<
	wse = "http://www.w3.org/2011/03/ws-evt"
>

我们还必须在 [PolicyNamespaces] 部分中指定规范支持的 WS-Policy 规范的版本。这允许验证器验证断言中嵌入的 WS-Policy 是否使用正确的规范版本,并对 WS-Policy 断言的属性使用正确的验证(WS-Policy 1.2 和 1.5 之间有区别)。WS-Eventing 规范只提到 WS-Policy 1.5,因此我们将这个部分编码如下:

清单 7. 架构的 PolicyNamespace 部分
[PolicyNamespaces]
<
   "http://www.w3.org/ns/ws-policy"
>

架构的其余部分关注断言本身。每个顶级断言都应该在一个单独的 [Syntax] 部分中描述。这些部分的语法非常类似于 Web 服务规范中使用的语法,通常可以从那些部分进行轻松修改。对于在几个顶级断言中包含重复断言片段的规范,可以在 [Referenced] 部分中包含这些片段。但是,WS-Eventing 规范不需要这种设置。

为创建 EventSource 断言的 [Syntax] 部分,我们要先复制规范的 9.1 节 中展示的语法,如下所示:

清单 8. 规范中展示的 EventSource 断言的语法
<wse:EventSource ...>
  <wse:FilterDialect URI="xs:anyURI" ...>
    xs:any*
  </wse:FilterDialect> * 
  <wse:FormatName URI="xs:anyURI" ...>
    
    xs:any*
  </wse:FormatName> * 
  <wse:DateTimeSupported .../> ?
  <wse:Expires min="xs:duration"? max="xs:duration"?.../> ? 
  <wse:EndToSupported .../> ?
  <wse:NotificationPolicy ...>
    xs:any
  </wse:NotificationPolicy> ?
  
  xs:any*
</wse:EventSource>

然后,我们需要进行以下修改,以便使其遵守验证器支持的架构格式:

  • <wse:EventSource ...> 之后添加基数指示符 ?,指出顶级断言在策略中不是必需的。如果不这样做,验证器会期望在其验证的每个策略中找到这个断言。
  • 移动基数指示符,使其出现在 <wse:FilterDialect>、<wse:FormatName><wse:NotificationPolicy> 的起始标记而不是结束标记之后。
  • 从标记集合中移除 xs:any*。通过阅读规范中给出的描述,我们发现这些标记旨在表明元素的可扩展性,因此我们使用省略号...替代它们。
  • 替换为 Expires 断言的属性提供的 xs:duration 类型,因为验证器不支持该类型。xs:unsignedLong 是一个合适的替代类型。

修改后的语法如下所示:

清单 9. 架构中将包含的 EventSource 断言的经过修改的语法
[Syntax]
<wse:EventSource ...>?
  <wse:FilterDialect URI="xs:anyURI" ...>*
  ...
  </wse:FilterDialect>  
  <wse:FormatName URI="xs:anyURI" ...>*
  ...
  </wse:FormatName>  
  <wse:DateTimeSupported .../> ?
  <wse:Expires min="xs:unsignedLong"? max="xs:unsignedLong"?.../> ? 
  <wse:EndToSupported .../> ?
  <wse:NotificationPolicy ...> ?
  ...
  </wse:NotificationPolicy> 
  ...
</wse:EventSource>

还必须针对 SubscriptionManager 断言创建一个 [Syntax] 部分,这可以通过应用上面的规则来完成。这些规则普遍适用于以这种形式提供语法的架构。现在就完成了我们的架构;完成的文件作为一个下载本文提供。

测试架构

创建支持 WS-Eventing 的架构后,现在可以使用安装了 Validator for WS-Policy in Eclipse 的 IBM Rational Application Developer 来测试它。验证器将默认情况下会使用 Eclipse 插件 jar 中分发的架构文件。要使用您自己的架构文件,则必须将验证器配置为指向从中读取架构文件的目录:

  1. Window > Preferences
  2. 从列表中选择 WS-Policy Validator。
  3. 单击首选项页上的浏览按钮,选择一个目录。然后,验证器将读取选中目录中所有扩展名为 .schema 的文件。删除这个字段的内容会导致验证器再次使用默认位置。
  4. 如果您想将您自己的架构添加到验证器提供的架构中,请将验证器分发的 .schema 文件复制到您配置的目录中。这些文件可以从插件 jar 文件中的架构文件夹提取。
  5. 重启 IBM Rational Application Developer 使更改生效。
图 53. 配置验证器使用的架构目录
配置验证器使用的架构目录

现在我们创建一些 WS-Policy 来进行验证:

  1. 切换到 Resource 透视图。
  2. File > New... > Project
  3. 在 New Project 对话框中选择 General > Project。然后单击 Next。
  4. 输入一个项目名称并单击 Finish。
  5. File > New > File
  6. 选择您的项目并输入一个合适的文件名,例如 policy.xml。
  7. 向您的文件添加一些策略。下面的策略应该够用:
清单 10. 测试架构的基本策略
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
xmlns:wse="http://www.w3.org/2011/03/ws-evt"
xmlns:test="http://www.ibm.com/websphere/policy/blueop/testing">
<wse:EventSource ...>
<wse:FormatName URI="...">
 <mex:Location
Type="wsdl:definitions"
 URI="http://example.com/Notif_WSDL_Metadata" />
</wse:FormatName>
</wse:EventSource>
</wsp:Policy>

如果架构正确,则不会出现验证错误。您将看到一个关于 mex:Location 元素的警告,因为该元素不是架构的一部分。

图 54. WS-Eventing 断言的正确验证
WS-Eventing 断言的正确验证

要确保验证正在工作,可以通过插入两个 DateTimeSupported 元素使我们的策略无效,其中一个元素应该会导致错误。

图 55. 重复的 DateTimeSupported 断言导致的验证错误
重复的 DateTimeSupported 断言导致的验证错误

故障诊断

如果验证结果不是预期的,可以查看 Eclipse 错误日志(Window > Show View > General > Error Log)。架构解析器将生成异常,它们应该有助于您诊断问题。例如,如果我们忘记更改 xs:Duration 属性类型,则会看到以下异常:

com.ibm.alphaworks.wspolicy.validator.SchemaParsingException: Unrecognised attribute key: duration

图 56. 架构解析器生成的一个异常
架构解析器生成的一个异常

下载

描述名字大小
样例策略集WSSecurity_default.zip2KB
样例应用程序InvalidPolicy.ear598KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=765277
ArticleTitle=在 Eclipse 中结合 IBM WebSphere Application Server 使用 Validator for WS-Policy
publish-date=10132011