Bonjour à tous,
J'ai un souci pour faire du swa attachment sous axis2 pour envoyer depuis un client un fichier sur un serveur.
Je génére mon stub et mes objects de messages avec wsdl2java.
Je ne fais pas du MTOM en déclarant un element binary64 dans le wsdl car j'utilise Xmlbeans comme databindings et j'ai des outofmemory et j'ai cru comprendre que ça n'étais pas vraiment possible de passer outre car Xmlbeans charge forcement les elements en mémoire.
Bref, j'ai donc voulu tester la méthode swa décrite ici: http://ws.apache.org/axis2/1_5_1/mtom-guide.html mais j'ai cette exception:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| java.lang.IllegalArgumentException: Null OutputStream specified
at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:577)
at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544)
at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:180)
at maltese.corto.communication.soapgenerated.MalteseStub$46.serialize(MalteseStub.java:7236)
at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerializeAndConsume(OMSourcedElementImpl.java:738)
at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:966)
at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:995)
at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:254)
at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:242)
at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:995)
at org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:498)
at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:72)
at org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:84)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:542)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:199)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
... |
Alors ça m'embete un peu d'utiliser cette methode swa car je doit aller taper dans le stub généré pour avoir accès au messagcontext. mais je pourrais pê abstraire ça lorsque j'aurais réussi à le faire marcher...
Voici le code de mon opération dans mon stub généré:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public monOperationRspDocument monOperation(
monOperationReqDocument monOperationReq62)
throws java.rmi.RemoteException
{
org.apache.axis2.context.MessageContext _messageContext = null;
try
{
org.apache.axis2.client.OperationClient _operationClient = _serviceClient.createClient(_operations[14].getName());
_operationClient.getOptions().setAction("monOperation");
_operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);
_operationClient.getOptions().setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
addPropertyToOperationClient(_operationClient, org.apache.axis2.description.WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR, "&");
// create a message context
_messageContext = new org.apache.axis2.context.MessageContext();
// create SOAP envelope with that payload
org.apache.axiom.soap.SOAPEnvelope env = null;
env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI()), monOperationReq62, optimizeContent(new javax.xml.namespace.QName("monService", "monOperation")));
//adding SOAP soap_headers
_serviceClient.addHeadersToEnvelope(env);
// set the message context with that soap envelope
_messageContext.setEnvelope(env);
// add attachment
FileDataSource fileDataSource = new FileDataSource("test-resources/mtom/test.jpg");
DataHandler dataHandler = new DataHandler(fileDataSource);
_messageContext.addAttachment("FirstAttachment", dataHandler);
// add the message contxt to the operation client
_operationClient.addMessageContext(_messageContext);
//execute the operation client
_operationClient.execute(true); |
Je m'arrete là car l'exception est jetée dans excecute...
Je précise que lorsque je commente la ligne
_operationClient.getOptions().setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
je communique avec mon serveur, mais je n'ai pas d'attachment...
Voilà, si vous avez une idée sur une property à setter ou autre je suis très preneur! merci d'avance!
Partager