2013-06-03 3 views
0

Я использую CXF 2.3.9 для создания загружаемого веб-сервиса. Вот часть моего сервера бобаВключено MTOM в CXF, но не может загрузить большой файл

@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 преобразуется в байт []. Я поменял их на 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(); 

Попробуйте поместить jaxb-api.jar и jaxws-api в classpath над вашей библиотекой jre, если вы используете Eclipse, поддержка не работает для меня.

Смежные вопросы