如何解决SOAP不会将byte []映射到DataHandler,而是抛出SAXException
我的SOAP API具有将文件作为二进制流的方法。在WSDL中,这只是base64Binary,但使用MTOM,应该可以对此进行优化。
我知道这应该可行,并且可以在旧项目中使用(仍然在Java 8上,并使用http://jax-ws.java.net/2.2.8/中的旧库)。现在,我尝试使用Java 11和更高版本的javax.xml.ws
。
Web服务非常简单:
@BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_MTOM_BINDING)
@WebService
@SOAPBinding(style = Style.RPC)
public interface Transfer {
@WebMethod
TransferResponse transfer(@XmlMimeType("application/octet-stream") DataHandler data);
}
该实现具有@MTOM
和其他注释:
@BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_MTOM_BINDING)
@MTOM
@WebService(endpointInterface = "com.example.transfer.Transfer")
public class TransferImpl implements Transfer { ...
但是我遇到了这个错误:
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>org.xml.sax.SAXException: Bad types (class [B -> class javax.activation.DataHandler)</faultstring>
我必须将javax.mail
添加到依赖项中(我正在使用maven / eclipse),这样它才能支持附件。
花了我一个小时左右的时间弄清楚了,因为消息只是附件不被支持。
那我现在想念什么呢?有些事情将从邮件库中获取数据并将其流式传输到DataHandler中,以便我可以读取数据。那是什么为什么会告诉我这些是不良类型?
@XmlMimeType("application/octet-stream")
应该清楚这是字节流。客户端可以只发送一个byte []并将其编码为base64。但是服务器应始终能够使用DataHandler
作为类型。客户也应该有该选择。
我使用Java代码和SOAP-UI对其进行了测试。在Java代码中,使用new DataHandler(new FileDataSource(file))
并将其发送到服务器时似乎可以正常工作。但是服务器似乎没有将附件映射到DataHandler。我是否需要配置某些东西或添加一些依赖关系?
在SOAP-UI中,仅当MTOM被停用时,它才起作用。
我得到一个SAXException
。 SAX = XML的简单API。因此,它认为这应该是XML吗?为什么会这样呢? class [B
不仅仅是Java中byte[]
的类型吗?
我可以在线找到一些论坛帖子,但找不到解决方案。
当我使用byte[]
而不是DataHandler
时,出现此错误:
客户端从服务器收到SOAP错误:org.xml.sax.SAXException:SimpleDeserializer在尝试反序列化时遇到了子元素,这是不期望的。
那甚至更奇怪。反序列化会是什么?这只是二进制数据。而且我在服务器日志中找不到任何内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。