带附件的 SOAP Java 接口 API
带附件的 SOAP API for Java™ (SAAJ) 接口用于 SOAP 消息传递,它提供了一种从 Java 编程模型通过 Internet 发送 XML 文档的标准方法。 SAAJ 用于在 SOAP 消息流经运行时环境时将它处理到适当的上下文上。
Java API for XML-Based RPC (JAX-RPC) 编程模型支持 SAAJ 1.2操作 XML。
JAX-WS 编程模型支持 SAAJ 1.2 和 1.3。 SAAJ 1.3 包含 SOAP 1.2 消息的支持。
SAAJ 的差异1.2和 SAAJ 1.3可以在主题中查看规范SAAJ 版本之间的差异。
如何在 Web Service 中使用消息?
Web Service 使用 XML 技术来交换消息。 这些消息符合 XML 模式。 开发 Web Service 应用程序时,只有有限的 XML API 可供使用,例如文档对象模型 (DOM)。 操作Java对象并在运行时完成序列化和反序列化更加高效。
Web Service 使用 SOAP 消息表示客户机和服务器之间的远程过程调用。 通常,SOAP 消息被反序列化为一系列表示参数和返回值的 Java 值类型业务对象。 此外,Java 编程模型还提供了支持应用程序和处理程序直接操作 SOAP 消息的 API。 因为该编程模型仅支持有限数目的 XML 模式类型,所以,该规范提供 SAAJ 数据模型作为扩展用来处理消息。
要操作 XML 模式类型,您需要使用自定义数据绑定器将 XML 模式类型映射到 Java 类型。
SAAJ 接口
与 SAAJ 相关的类位于 javax.xml.soap 包中。 SAAJ 在接口和抽象类的基础上构建,并且许多类从调用工厂方法来创建工厂(如 SOAPConnectionFactory 和 SOAPFactory)开始。
Permission:
/opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties : access denied
(java.io.FilePermission /opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties
read)
Code:
com.ibm.ws.wsfvt.test.binding.addr1.binder.AddressBinder
in {file:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/
ahp6405Node01Cell/DataBinding.ear/address1.war/WEB-INF/lib
/addressbinder1.jar}
Stack Trace:
java.security.AccessControlException: access denied (java.io.FilePermission
/opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties read)
.SOAPFactory 会忽略异常,并继续确定要装入的实现的下一种方法。 因此,可以忽略此安全性异常的日志条目。
由于该产品使用 SOAPFactory 支持其他 Web 服务技术,例如 WS-Addressing (WS-A)、WS-Atomic Transaction (WS-AT) 和 WS-Notification,因此您可以忽略此SecurityException在任何启用了 Java 安全性的 Web 服务应用程序中。
- SOAPMessage:包含消息,包括 XML 和非 XML 部分
- SOAPHeader:表示 SOAP 头 XML 元素
- SOAPBody:表示 SOAP 主体 XML 元素
- SOAPElement:表示 SOAP 消息中的其他元素
- MessageContext:包含 SOAP 消息和相关的属性
- AttachmentPart:表示二进制附件
- SOAPPart:表示消息的 XML 部分
- SOAPEnvelope:表示 SOAP 包络 XML 元素
- SOAPFault:表示 SOAP 故障 XML 元素
SAAJ 模型中的主要接口是 javax.xml.soap.SOAPElement(也称为 SOAPElement)。 通过使用此模型,应用程序可以处理使用预先存在的 DOM 代码的 SAAJ 模型。 将预存在的 DOM 对象转换为 SAAJ 对象也很容易。
使用 SAAJ 接口创建的消息遵循 SOAP 标准。 SOAP 消息在 SAAJ 模型中表示为 javax.xml.soap.SOAPMessage 对象。 消息的 XML 内容由 javax.xml.soap.SOAPPart 对象表示。 每个 SOAP 部件有一个 SOAP 包络。 此封包由 SAAJ javax.xml.SOAPEnvelope 对象表示。 SOAP 规范定义驻留在 SOAP 包络中的各种元素;SAAJ 为 SOAP 包络中的各种元素定义对象。
SOAP 消息还可以包含称为附件的非 XML 数据。 这些附件由可从 SOAPMessage 对象访问的 SAAJ AttachmentPart 对象表示。
- 一个 Web Service 可能是另一个 Web Service 的同步管道。 在这种情况下,仅转发 SOAP 消息。
- Web Service 可使用不同的数据模型(例如服务数据对象 (SDO))来操控消息。 将消息从 SAAJ DOM 转换为另一种数据模型是更容易的。
- 处理程序(例如,数字签名验证处理程序)可能要对消息进行一般处理。
由于 SOAPElement 接口并非始终都是旧系统的最佳替代者,因此,可能需要进一步映射 XML 模式类型。 在这种情况下,您可能需要使用一个通用编程模型(例如,SDO),该模型更适合于以数据为中心的应用程序。
XML 模式可以配置为包含将 SDO 或数据对象与 Java 对象配对的自定义数据绑定。 例如,运行时将入局 SOAP 消息呈示到 SOAPElement 接口中,并将它传递给客户数据绑定程序以进行更多处理。 如果入局消息包含 SDO,那么运行时识别数据对象代码,查询它的类型映射以查找定制绑定程序,并构建用来表示 SDO 代码的 SOAPElement 接口。 SOAPElement 被传递给 SDOCustomBinder。
请参阅有关定制数据绑定程序的信息,以了解有关使用 SOAPElement、SDO 和定制绑定程序来开发应用程序的过程的更多信息。
SOAPMessage.getSOAPHeader和getSOAPBody方法抛出SOAPException如果消息中没有相应元素。 提供了一个系统属性 com.ibm.websphere.webservices.soap.IBMSOAPMessage.ENABLE_LEGACY_GETSOAP_BEHAVIOR,可将行为恢复为返回 NULL 而不抛出异常。 此系统属性是使用 JVM 定制属性 com.ibm.websphere.webservices.soap.enable.legacy.get.behavior 进行设置。 此 JVM 定制属性的缺省值为 false。 如果将此 JVM 属性设置为 true,那么将还原至先前的行为,即在没有相应消息时对 SOAPMessage.getSOAPHeader 和 getSOAPBody 方法返回空值。先前返回空值的行为不符合规范。
有关受支持的标准和规范的完整列表,请参阅 Web Service 规范和 API 文档。