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 (将#修改为@)