I have a service that needs some attachments sent with the SOAP request. For this service I generated a client using Maven's axis2-wsdl2code-maven-plugin and Apache Axis2 1.8.0. The generated stub looks pretty much as mentioned in https://axis.apache.org/axis2/java/core/docs/mtom-guide.html#a32 - with the exception that no attachments are sent. It seems as easy as I just need to create a new MessageContext and use addAttachement with data handlers.
Now my problem is that I am using the generated methods, and I see no way from outside to inject a MessageContext or the attachement datahandlers. I also tried to access the MessageContext as mentioned in Accessing the MessageContext but the method
MessageContext.getCurrentMessageContext()
always returns null for me. And even if it didn't I would not be sure how to inject it into the generated method.
How can I add attachments to the generated stub's functionality?
Just for completeness, here is one of the generated operations. You can see it constructs it's own MessageContext.
public com.example.myservice.ws.access.CreateResponseDocument create(
com.example.myservice.ws.access.CreateDocument create42) throws java.rmi.RemoteException {
org.apache.axis2.context.MessageContext _messageContext =
new org.apache.axis2.context.MessageContext();
try {
org.apache.axis2.client.OperationClient _operationClient =
_serviceClient.createClient(_operations[21].getName());
_operationClient
.getOptions()
.setAction("http://access.ws.myservice.example.com/AproachWebServices/createRequest");
_operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);
addPropertyToOperationClient(
_operationClient,
org.apache.axis2.description.WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
"&");
// create SOAP envelope with that payload
org.apache.axiom.soap.SOAPEnvelope env = null;
env =
toEnvelope(
getFactory(_operationClient.getOptions().getSoapVersionURI()),
create42,
optimizeContent(
new javax.xml.namespace.QName(
"http://access.ws.myservice.example.com", "create")),
new javax.xml.namespace.QName("http://access.ws.myservice.example.com", "create"));
// adding SOAP soap_headers
_serviceClient.addHeadersToEnvelope(env);
// set the message context with that soap envelope
_messageContext.setEnvelope(env);
// add the message contxt to the operation client
_operationClient.addMessageContext(_messageContext);
// execute the operation client
_operationClient.execute(true);
org.apache.axis2.context.MessageContext _returnMessageContext =
_operationClient.getMessageContext(
org.apache.axis2.wsdl.WSDLConstants.MESSAGE_LABEL_IN_VALUE);
org.apache.axiom.soap.SOAPEnvelope _returnEnv = _returnMessageContext.getEnvelope();
_returnEnv.buildWithAttachments();
java.lang.Object object =
fromOM(
_returnEnv.getBody().getFirstElement(),
com.example.myservice.ws.access.CreateResponseDocument.class);
org.apache.axis2.transport.TransportUtils.detachInputStream(_returnMessageContext);
return (com.example.myservice.ws.access.CreateResponseDocument) object;
} catch (org.apache.axis2.AxisFault f) {
org.apache.axiom.om.OMElement faultElt = f.getDetail();
if (faultElt != null) {
if (faultExceptionNameMap.containsKey(
new org.apache.axis2.client.FaultMapKey(faultElt.getQName(), "create"))) {
// make the fault by reflection
try {
java.lang.String exceptionClassName =
faultExceptionClassNameMap.get(
new org.apache.axis2.client.FaultMapKey(faultElt.getQName(), "create"));
java.lang.Class exceptionClass = java.lang.Class.forName(exceptionClassName);
java.lang.reflect.Constructor constructor =
exceptionClass.getConstructor(java.lang.String.class);
java.lang.Exception ex = (java.lang.Exception) constructor.newInstance(f.getMessage());
// message class
java.lang.String messageClassName =
faultMessageMap.get(
new org.apache.axis2.client.FaultMapKey(faultElt.getQName(), "create"));
java.lang.Class messageClass = java.lang.Class.forName(messageClassName);
java.lang.Object messageObject = fromOM(faultElt, messageClass);
java.lang.reflect.Method m =
exceptionClass.getMethod("setFaultMessage", new java.lang.Class[] {messageClass});
m.invoke(ex, new java.lang.Object[] {messageObject});
throw new java.rmi.RemoteException(ex.getMessage(), ex);
} catch (java.lang.ClassCastException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
} catch (java.lang.ClassNotFoundException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
} catch (java.lang.NoSuchMethodException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
} catch (java.lang.reflect.InvocationTargetException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
} catch (java.lang.IllegalAccessException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
} catch (java.lang.InstantiationException e) {
// we cannot intantiate the class - throw the original Axis fault
throw f;
}
} else {
throw f;
}
} else {
throw f;
}
} finally {
if (_messageContext.getTransportOut() != null) {
_messageContext.getTransportOut().getSender().cleanup(_messageContext);
}
}
}