SchemaValidation在MTOM文件上传中带来ClassCastException和OutOfMemoryEr



我创建了文件上传Web服务:

@SchemaValidation
@WebService(endpointInterface = "com.ws.server.ExchangeEndpoint")
public class ExchangeEndpoint {
@Override
public String uploadDocument(long residentId, String fileName, String mimeType, DataHandler data) {
    try {
        StreamingDataHandler dh = (StreamingDataHandler) data;  //it cast exception

这是接口:

@WebService
@StreamingAttachment(parseEagerly = true, memoryThreshold = 4194304L)
@MTOM
public interface ExchangeEndpoint {
    @WebMethod String uploadDocument(@XmlElement(name = "residentId",required = true) long residentId,
                                 @XmlElement(name = "fileName",required = true) String fileName,
                                 @XmlElement(name = "mimeType",required = true) String mimeType,
                                 @XmlElement(name = "data",required = true) @XmlMimeType("application/octet-stream") DataHandler data);

它抛出ClassCastException异常:

java.lang.ClassCastException: javax.activation.DataHandler cannot be cast to com.sun.xml.ws.developer.StreamingDataHandler

但当我删除@SchemaValidation注释时,一切都很好

那么,为什么@SchemaValidation会损坏DataHandler对象呢?

当我尝试上传大于300mb的大文件时,我会出现内存不足错误:

java.lang.OutOfMemoryError: Java heap space  at org.jvnet.staxex.ByteArrayOutputStreamEx.readFrom(ByteArrayOutputStreamEx.java:75) at org.jvnet.staxex.Base64Data.get(Base64Data.java:331)

而且如果没有@SchemaValidation,一切都很好

这是一个众所周知的问题。在没有模式验证的情况下,您的文件可以作为二进制附件传输,一次传输一个块,这样就不会出现内存问题。如果添加模式验证,则文件必须以base64编码,并内联在xml消息中;当文件太大时,这会导致内存问题。我所知道的所有jaxws实现都是这样工作的。

如果你在你的网络服务中添加数字签名,你也会因为同样的原因遇到同样的问题。

不幸的是,我没有解决那个问题的办法。

相关内容

  • 没有找到相关文章

最新更新