2013-08-21 42 views
0

我創建的文件上傳Web服務:SchemaValidation帶來ClassCastException異常和OutOfMemoryError異常在MTOM上傳文件

@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註釋所有作品f INE!

那麼爲什麼@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工作正常!

+0

嘗試增加分配給java機器的內存,看看你是否能夠驗證更大的附件。 – Xargos

回答

1

這是一個衆所周知的問題。 如果沒有模式驗證,您的文件可以作爲二進制附件一次傳輸一個塊,以便不會出現內存問題。 如果您添加模式驗證,則必須在xml消息中將文件編碼爲base64並內聯;這會在文件太大時導致內存問題。 我知道所有的jaxws實現都是這樣工作的。

如果您將數字簽名添加到您的Web服務中,您也有同樣的問題出於同樣的原因。

我很遺憾沒有解決這個問題。