Provider API
1 Messaging Modes(消息模型)
继承了Provider接口的对象可以使用两个消息模型:
--消息模型
--消息负载模型
. 消息模型
当使用消息模型时,Provider的实现使用完整的消息。完整的消息包含任意绑定,header,包装。
你指定Provider的实现使用消息模型,它的值是java.xml.ws.Service.Mode.MESSAGE,它由javax.xml.ws.ServiceMode注解提供。
. 消息负载模型
在消息负载模型下,Provider实现使用消息负载,如例,Provider实现仅使用SOAP消息的body部分。
如果你不提供@ServiceMode注解,Provider实现将默认使用消息负载(PAYLOAD)模型。
2 数据类型(Data Types)
. 概述
Provider实现,因为他们是低级别的对象,不能使用由相同JAXB生成的高级别的消费者API类型。Provider实现使用下列类型:
--javax.xml.transform.Source
--javax.xml.soap.SOAPMessage
--javax.activetion.DataSource
. 使用Source对象
Provider实现能接受与返回从javax.xml.transform.Source接口派生的对象。Source对象是低级别的拥有xml文档的对象。
每个Source实现类提供方法访问存储的xml文档并操纵它的内容。下面的对象实现了Source接口:
--DOMSource容纳一个DOM树的xml消息。xml消息存储在Mode对象集中,并能通过getNode()方法访问它们。节点能
使用setNode()方法被添加或增加到DOM树。
--SAXSource容纳一个SAX对象的xml消息。SAX对象包含一个InputSource对象,它包含原数据和解析原数据的XMLReader对象。
--StreamSource容纳一个数据流的xml消息。这个数据流能像其它任何数据流一样操作。
注意:当使用Source对象的时候,开发人员负责确保所有必须的绑定具体包装被添加到消息上。
. 使用SOAPMessage对象
Provider实现能使用javax.xml.soap.SOAPMessage对象,当下面条件为真时:
--Provider实现正使用SOAP绑定。
--Provider实现正使用消息模型。
SOAPMessage对象,顾名思义,拥有一个SOAP消息。他包含一个SOAPPart对象和零到多个AttachmentPart对象。
SOAPPart对象包含SOAP的具体部分,包含:soap信封,soap头和soap消息主体。AttachmentPart对象包含作为附件
通过的二进制数据。
. 使用DataSource对象
Provider实现能使用实现了javax.activation.DataSource接口的对象,当下面条件为真时:
--这实现类正使用HTTP 绑定。
--这实现类正在消息模型。
DataSource对象提供了一个使用MIME类型数据的机制,它来源于URLs,files,字节数组。
3 实现Provider对象
Provider接口是比较容易实现的。它仅有一个方法,invoke(),它必须被实现,它还有三个简单的要求:
--必须有@WebServiceProvider注解。
--必须有默认的public构造函数
--必须实现Provider接口的类型版本。换而言之,你不能实现Provider<T>接口。你必须实现使用一个具体数据类型
的接口的版本。如例,你能实现Provider<SAXSource>接口。
. working with messages
与高级别的SEI服务实现不同,Provider实现接受原xml数据的请求和发送必须的原xml数据响应。
. 实现invoke()方法
如例:
下面这个例子,Provider实现在负载模型下使用DOMSource对象。