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 <dk...@apache.org> > > 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 > >