我创建了文件上传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实现都是这样工作的。
如果你在你的网络服务中添加数字签名,你也会因为同样的原因遇到同样的问题。
不幸的是,我没有解决那个问题的办法。