Java SchemaValidation在MTOM文件上载中带来ClassCastException和OutOfMemoryError
我创建了文件上载Web服务:Java SchemaValidation在MTOM文件上载中带来ClassCastException和OutOfMemoryError,java,web-services,jax-ws,java-metro-framework,mtom,Java,Web Services,Jax Ws,Java Metro Framework,Mtom,我创建了文件上载Web服务: @SchemaValidation @WebService(endpointInterface = "com.ws.server.ExchangeEndpoint") public class ExchangeEndpoint { @Override public String uploadDocument(long residentId, String fileName, String mimeType, DataHandler data) { try
@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,所有作品都很好这是一个众所周知的问题。 在没有模式验证的情况下,您的文件可以作为二进制附件一次传输一个数据块,这样就不会出现内存问题。 如果添加模式验证,则该文件必须编码为base64并内联到xml消息中;当文件太大时,这会导致内存问题。 我知道的所有jaxws实现都是这样工作的 如果将数字签名添加到Web服务中,则出于相同的原因,您会遇到完全相同的问题
不幸的是,我没有解决这个问题的方法。尝试增加分配给java机器的内存,看看是否能够验证更大的附件。apache cxf 3.2.2也存在这个令人困惑的问题。我很惊讶它的票数如此之少。谢谢分享!