Thanks, Aki. I was going to do this myself, but have been wrapped up in other issues.

Just for anyone else catching this thread, the JAX-WS technique currently works for attachments returned by the service (on both service and client side), but not for attachments sent by the client.

  - Dennis


On 06/27/2013 10:39 PM, Aki Yoshida wrote:
I created CXF-5095 to allow adding attachments using jaxws
attachments<https://issues.apache.org/jira/browse/CXF-5095> and
mentioned there two approaches that I tried and of which, I prefer option 2.



2013/6/11 Daniel Kulp <[email protected]>

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 <[email protected]> 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
[email protected] - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com



Reply via email to