Hi, I've been able to return strings in SOAP attachments, but I haven't been successful returning a byte array. I wrote in previously about this problem because I was getting error messages such as "javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/octet-stream". It was suggested that I try running with the latest build from CVS because Axis release 1.1 had a problem with byte arrays in attachments. So I'm running with the July 9 build. With this build, I no longer get the UnsupportedDataTypeException errors, but now I get no attachment in the response message.
Here's the simple example I used to get a string returned in an attachment. Then a few small changes to return a byte array. I would appreciate it if someone could detect where I'm going wrong with this approach. Thanks! . . . Phil ****** ****** Client code ****** ****** package us.pooch.soaptest.attachments; import org.apache.axis.AxisFault; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory; import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory; import org.apache.axis.transport.http.HTTPConstants; import org.apache.axis.utils.Options; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.soap.AttachmentPart; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPConnection; import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import java.io.File; import java.net.URL; import java.util.Hashtable; import java.util.Iterator; import java.util.ListIterator; import java.util.Vector; public class SOAPAttachmentMimeTypeDemoClient { public static void main(String args[]) { try { SOAPAttachmentMimeTypeDemoClient demoClient = new SOAPAttachmentMimeTypeDemoClient(); demoClient.demoGetString(); demoClient.demoGetBytes(); } catch (Exception e) { System.err.println(e); e.printStackTrace(); } System.exit(18); } protected DataHandler runDemo(String functionName) throws Exception { String endPointURLString = "http://localhost:8080/SOAPAttachmentMimeTypeDemoProjectWeb/services/SOAPAttachmentMimeTypeDemoService"; SOAPConnectionFactory soapConnectionFactory = javax.xml.soap.SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope requestEnvelope = soapPart.getEnvelope(); SOAPBody body = requestEnvelope.getBody(); SOAPBodyElement operation = body.addBodyElement(requestEnvelope.createName(functionName)); javax.xml.soap.SOAPMessage returnedSOAPMessage = soapConnection.call(soapMessage, endPointURLString); Iterator iterator = returnedSOAPMessage.getAttachments(); if (!iterator.hasNext()) { //The wrong type of object that what was expected. System.out.println("Received problem response from server"); throw new AxisFault( "", "Received problem response from server", null, null); } return (DataHandler) ((AttachmentPart) iterator.next()).getDataHandler(); } public void demoGetString() throws Exception { DataHandler rdh = runDemo("getString"); String returnedData = (String) rdh.getContent(); if (!returnedData.equals("You got me!")) { System.err.println("Did not get the expected string."); throw new AxisFault("", "Did not get the expected string.", null, null); } System.out.println("getString() succeeded"); } public void demoGetBytes() throws Exception { DataHandler rdh = runDemo("getBytes"); byte[] returnedData = (byte[]) rdh.getContent(); byte[] expectedArray = new byte[] { 01, 02, 03, 04 }; if (!returnedData.equals(expectedArray)) { System.err.println("Did not get the expected byte[]."); throw new AxisFault("", "Did not get the expected byte[].", null, null); } System.out.println("getBytes() succeeded"); } } ****** ****** Service code ****** ****** package us.pooch.soaptest.attachments; import javax.activation.DataHandler; public class SOAPAttachmentMimeTypeDemoService { public DataHandler getString() { return new DataHandler("You got me!", "text/plain"); } public DataHandler getBytes() { byte[] arrayToReturn = new byte[] { 01, 02, 03, 04 }; return new DataHandler(arrayToReturn, "application/octet-stream"); } } ****** ****** WSDD ****** <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns:ns1="SOAPAttachmentMimeTypeDemoService" > <service name="SOAPAttachmentMimeTypeDemoService" provider="java:RPC" > <parameter name="className" value="us.pooch.soaptest.attachments.SOAPAttachmentMimeTypeDemoService"/> <parameter name="allowedMethods" value="getString getBytes"/> <operation name="getString" returnQName="returnqname" returnType="ns1:DataHandler" /> <operation name="getBytes" returnQName="returnqname" returnType="ns1:DataHandler" /> <typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" languageSpecificType="java:javax.activation.DataHandler" qname="ns1:DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </service> </deployment>