SchemaValidation在MTOM文件上载中引入ClassCastException和OutOfMemoryError

时间:2013-08-21 13:47:32

标签: java web-services jax-ws java-metro-framework mtom

我创建了文件上传webservice:

@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时,我得到OutOfMemoryError:

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一切正常!!!

1 个答案:

答案 0 :(得分:2)

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

如果您向网络服务添加数字签名,则出于同样的原因,您会出现同样的问题。

遗憾的是,我无法解决这个问题。