2013-06-03 51 views
0

我正在使用CXF 2.3.9創建上載Web服務。這裏是我的服務器bean的一小部分在CXF中啓用了MTOM,但無法上傳大文件

@XmlType 
public class FileUploader 
{ 
    @XmlMimeType("application/octet-stream") 
    private DataHandler Dfile; 
} 

cxf.xml

<jaxws:endpoint id="uploadfile" 
        implementor="com.ibm.uploadservice.UploadServiceImpl" 
        address="/UploadWS"> 
        <jaxws:properties> 
     <entry key="mtom-enabled" value="true"/> 
    </jaxws:properties> 

當wsdl2java.bat的生成文件時,我看到我的DataHandle類型轉換爲byte []。我將它們改回到DataHandle並導入必要的庫。

當我跑我的客戶,我得到了下面的堆棧跟蹤

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at com.sun.xml.bind.v2.util.ByteArrayOutputStreamEx.readFrom(ByteArrayOutputStreamEx.java:75) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Base64Data.get(Base64Data.java:196) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Base64Data.writeTo(Base64Data.java:312) 
    at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.text(UTF8XmlOutput.java:312) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:356) 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$PcdataImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:183) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:256) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:130) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:161) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:131) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:333) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251) 
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source) 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:550) 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:232) 
    at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:169) 
    at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:110) 
    at org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:544) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:341) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:294) 

我怎樣才能解決呢?謝謝你和問候

回答

1

這是有效的,如果你是以下this tutorial

您需要刪除下面幾行:

factory.getInInterceptors().add(new LoggingInInterceptor()); 
factory.getOutInterceptors().add(new LoggingOutInterceptor()); 

下面的代碼添加到客戶端

Map<String,Object> props = new HashMap<String, Object>(); 
props.put("mtom-enabled", Boolean.TRUE); 
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 

factory.setServiceClass(UploadSEI.class); 
factory.setAddress("http://localhost:8080/CxfService/UploadWS"); 
factory.setProperties(props); 

UploadSEI client = (UploadSEI) factory.create(); 

如果您使用的是Eclipse,請嘗試將jaxb-api.jar和jaxws-api放入您的jre庫之上的classpath中,否則認可對我無效。