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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
_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!