This SHOULD be handled in the WrappedMessageContext, but it looks potentially 
incomplete.  The "put" is certainly not wired in for the 
MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS key.   However, it looks like the 
get should have returned a viable Map.  I guess the suggestion is to breakpoint 
in the AttachmentOutInterceptor and see if it's managed to see if an attachment 
is there or not.   

Dan



On Jun 8, 2013, at 10:41 PM, Dennis Sosnoski <d...@sosnoski.com> wrote:

> 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_MESSAGE_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>
> 

-- 
Daniel Kulp
dk...@apache.org - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com

Reply via email to