Hi Dennis,
The following code works for me with Dispatch interface:
...
Dispatch<SOAPMessage> dispatch = service1.createDispatch(portName1,
SOAPMessage.class, Mode.MESSAGE);
Map<String, DataHandler> attachments = buildAttachments();
dispatch.getRequestContext().put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS,
attachments);
...
Regards,
Andrei
> -----Original Message-----
> From: Dennis Sosnoski [mailto:[email protected]]
> Sent: Sonntag, 9. Juni 2013 04:41
> To: [email protected]
> Subject: Attachments for Dispatch not supported?
>
> I've been trying to use attachments with the Dispatch api, and haven't been
> able to make it work. After digging through the code I couldn't see anywhere
> that it was even trying to make it work. Is this just not supported?
>
> Attachments work without any problems on the Provider side.
>
> Here's a sample for Dispatch:
>
> // create and configure the dispatch object with actual service
> endpoint
> address
> Service service = Service.create(new QName("http://cxf.apache.org",
> "attachmentService"));
> QName portQName = new QName("http://cxf.apache.org",
> "attachmentPort");
> service.addPort(portQName, SOAPBinding.SOAP12HTTP_BINDING,
> args[0]);
> Dispatch<Source> dispatch = service.createDispatch(portQName,
> Source.class, Service.Mode.PAYLOAD,
> new AddressingFeature(true));
> SOAPBinding binding = (SOAPBinding)dispatch.getBinding();
> binding.setMTOMEnabled(true);
>
> // configure logging to view messages being exchanged
> ...
>
> // set attachment to be sent
> Map<String, Object> requestContext = dispatch.getRequestContext();
> Map<String, DataHandler> attachments = (Map<String,
> DataHandler>)requestContext.
> get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
> if (attachments == null) {
> attachments = new HashMap<String, DataHandler>();
> requestContext.put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS,
> attachments);
> }
> byte[] bytes = new byte[1024];
> for (int i = 0; i < bytes.length; i++) {
> bytes[i] = (byte)i;
> }
> attachments.put("attachment-1", new DataHandler(new
> ByteArrayDataSource(bytes)));
>
> // configure the WS-Addressing Action to select operation
> ...
>
> // execute the request
> Source response = dispatch.invoke(new StreamSource(new
> ByteArrayInputStream("<test/>".getBytes("UTF-8"))));
> System.out.println("Success");
>
> The request gets sent using mime, but without the attachment. Here's the
> Provider code that works:
>
> @MTOM(threshold = 0, enabled = true)
> @WebServiceProvider(
> portName = AttachConstants.PORT_LOCALNAME,
> serviceName = AttachConstants.SERVICE_LOCALNAME,
> targetNamespace = AttachConstants.SERVICE_NAMESPACE)
> @ServiceMode(value = Service.Mode.PAYLOAD)
> @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
> public class AttachProvider implements Provider<StreamSource> {
> /** Injected context for invocations. */
> @Resource
> private WebServiceContext serviceContext;
>
> private void setAttachment(DataHandler handler) {
> Map<String, DataHandler> attachments = new HashMap<String,
> DataHandler>();
> attachments.put(AttachConstants.OUT_ATTACH_ID, handler);
> serviceContext.getMessageContext().put(MessageContext.OUTBOUND_MESSA
> GE_ATTACHMENTS,
> attachments);
> }
>
> public StreamSource invoke(StreamSource request) {
> ...
> byte[] bytes = new byte[AttachConstants.ATTACHMENT_SIZE];
> for (int i = 0; i < AttachConstants.ATTACHMENT_SIZE; i++) {
> bytes[i] = (byte)i;
> }
> setAttachment(new DataHandler(new ByteArrayDataSource(bytes)));
>
> Has anyone else gotten Dispatch attachments to work?
>
> Thanks,
>
> - Dennis
>
> --
>
> Dennis M. Sosnoski
> Java SOA and Web Services Consulting
> <http://www.sosnoski.com/consult.html>
> CXF and Web Services Security Training
> <http://www.sosnoski.com/training.html>
> Web Services Jump-Start <http://www.sosnoski.com/jumpstart.html>