Skip to main content Skip to complementary content

1) Annotating the Message

1a) Modifying your schema for MTOM

Lets say we have a Picture schema type like this:

<schema targetNamespace="http://pictures.com"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <element name="Picture">
            <complexType>
            <sequence>
            <element name="Title" type="xsd:string"/>
            <element name="ImageData" type="xsd:base64Binary"/>
            </sequence>
            </complexType>
            </element>
            </schema>

In this case the ImageData element is something we would like to have transferred as an attachment. To do this we just need to add an xmime:expectedContentTypes annotation:

<schema targetNamespace="http://pictures.com" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
            <element name="Picture">
            <complexType>
            <sequence>
            <element name="Title" type="xsd:string"/>
            <element name="ImageData" type="xsd:base64Binary"
            xmime:expectedContentTypes="application/octet-stream"/>
            </sequence>
            </complexType>
            </element>
            </schema>

This tells JAXB (which WSDL2Java uses to generate POJOs for your service) that this field could be of any content type. Instead of creating a byte[] array for the base64Binary element, it will create a DataHandler instead which can be used to stream the data.

1b) Annotation your JAXB beans to enable MTOM

If you're doing code first, you need to add an annotation to your POJO to tell JAXB that the field is a candidate for MTOM optimization. Lets say we have a Picture class with has Title and ImageData fields, then it might look like this:

@XmlType
            public class Picture {
            private String title;
            
            @XmlMimeType("application/octet-stream")
            private DataHandler imageData;
            
            public String getTitle() { return title; }
            public void setTitle(String title) { this.title = title; }
            
            public DataHandler getImageData() { return imageData; }
            public void setImageData(DataHandler imageData) 
            { this.imageData = imageData; }
            }

Note the use of 'application/octet-stream'. According to the standard, you should be able to use any MIME type you like, in order to specify the actual content of the attachment. However, due to a defect in the JAX-B reference implementation, this won't work.

Did this page help you?

If you find any issues with this page or its content – a typo, a missing step, or a technical error – please let us know!