Soap 流式自定义对象

Soap 流式自定义对象,soap,jaxb,jax-ws,glassfish-3,Soap,Jaxb,Jax Ws,Glassfish 3,我正在构建一个SOAP Web服务。我正在使用JAX-WS创建此服务,并将其部署在Glassfish 3.1.2服务器上 我可以让这个服务返回一个字符串构建,其中包含我想要的XML表示形式。我还可以让它返回一个特定的对象。我遇到的问题是流媒体此资源 这就是我到目前为止所做的: 接口: @MTOM @网络服务 @XmlRootElement(name=“root.element.class.location”) @SOAPBinding(style=style.RPC,use=use.LITERA

我正在构建一个SOAP Web服务。我正在使用JAX-WS创建此服务,并将其部署在Glassfish 3.1.2服务器上

我可以让这个服务返回一个字符串构建,其中包含我想要的XML表示形式。我还可以让它返回一个特定的对象。我遇到的问题是流媒体此资源

这就是我到目前为止所做的:

接口

@MTOM
@网络服务
@XmlRootElement(name=“root.element.class.location”)
@SOAPBinding(style=style.RPC,use=use.LITERAL)
公共接口ResultsServer{
@网络方法
@XmlMimeType(“text/xml”)
公共测试getResultDataAsXML(@WebParam(name=“Id”)整数Id)引发异常;
}
实施

----编辑---

这是我想流式处理我的资源的地方。假设我需要我的
结果
对象变得非常大,我不想保存这是内存,我想不保存它就开始发送它。(在代码中注释)

@WebService(endpointInterface=“my.endpoint.class”)
@StreamingAttachment(parsely=true,memoryThreshold=4000000L)
公共类ResultsServerImpl实现ResultsServer{
@凌驾
公共测试getResultDataAsXML(整数id)引发异常{
测试结果=新测试();

对于(int i=0;i我建议使用thoughtworks提供的xstream()库进行流式处理,因为它可以绑定到服务的两侧,并且与SOAP信封兼容。事实上,它甚至还与ActiveSOAP集成

可以在上看到SOAP信封包装的xstream对象的示例


XStream已经用于一些非常大的流处理(我已经将它用于一些100+MB的大型文本对象,没有任何问题)。

JAX-WS实现将利用JAXB实现来封送对象(最有可能是StAX XMLStreamWriter),因此输出将流化(不会在内存中创建XML文档)


@布莱斯杜汉,我想你已经用我想要的方式表达了。 是的,这将阻止完全保存的测试实例 在内存中。有办法做到这一点吗

如果希望数据以XML形式出现在消息中(与SOAP附件相反),您可以利用JAXB的封送事件。在
beforemashal
事件中,您可以将数据加载到对象中,然后在
afterUnmarshal
方法中清除它。最终,所有数据都将被拉入,但不会同时被引用


无论是谁标记了我,请告诉我您希望看到的内容。我了解此人的经历,并且在尝试获取XML内容时,SOAP的大多数datahandler对象都非常复杂,并且往往具有非人类可读的格式。我建议使用一个非常好的库,它在这方面具有强大的功能。我“如果需要,我很乐意更改或删除我的答案,但投票否决我对blo0p3r和我都没有任何好处。谢谢。这很有趣。我很欣赏这个建议(而且我认为投票否决的人应该提供原因,并提出更好/不同的建议)。但这会将对象转换为XML对象。这种情况已经发生。您的建议是将此对象转换为字符串,然后将此字符串流式处理?我还注意到,这些类型被标记为
class=“String”
,而不是
xsi:type=“xs:String”
。我假设后者更适合与.NET achitecture(在我的例子中是接收端)兼容。实际上,它不必是字符串,因为它可以在实例化时使用基于sTax的解析器(用于序列化)
XStream XStream=new XStream(new StaxDriver())
然后当您抓取对象时,您可以通过java.io.OutputStream将其直接流式传输到输出流).至于在.Net端点上阅读本文,我在这里没有经验,但我知道有两个库可以做到这一点,例如。JAX-WS实现将利用JAXB实现封送对象(最有可能是一个StAX
XMLStreamWriter
),因此输出将流化(不会在内存中创建XML文档)。你在寻找一种方法来阻止
Test
的实例在内存中完全实现吗?@BlaiseDoughan我想你的措辞和我所寻找的一样。是的,那将是为了防止
Test
的实例完全保存在内存中。有没有一种方法可以做到这一点?另外:感谢关于JAXB mar的信息shaling。这确实回答了我遇到的很多问题。这似乎是我想要采取的过程。不幸的是,我不熟悉封送事件的使用。我正在研究这一点。如果您能提供任何关于使用封送事件的使用示例,我将不胜感激。在研究这一点之后,我的问题更具体一点:什么你指的是我要将数据加载到的对象吗?
Marshaller
Unmarshaller
都有自己的
侦听器,这个对象的数据是如何从一个对象传输到另一个对象的?不幸的是,我想我可能在这里遗漏了一大块谜题。@blo0p3r-到你的域模型中。如下所示问题(请原谅我没有理解):我的服务器正在向客户端发送信息。因此,我从未在服务器上“解组”我的XML。
afterUnmarshal
从未被调用。除此之外,
beforemashal
afterMarshal
仅在我返回完整对象时才被调用(即:
返回结果
-在上面的实现中)。我不清楚如何通过这些函数在我的域模型中设置任何值来节省results对象中的内存,因为在任何封送处理函数