Jason, You shouldn't have to create the message properties explicitly. This should be done by the CXF WS-Addressing MAPAggregator interceptor (that runs *before* your custom interceptor). The MAPAggregator should be installed as a side-effect of setting the WSAddressingFeature. Can you bump up logging to the max to ensure the MAPAggregator is actually being traversed?
/Eoghan 2009/11/9 Jason Clark <[email protected]> > Thanks again Eoghan, > > How do I go about setting the values that are retrieved by ContextUtils in > my Interceptor? > > I've created my addressing properties with: > > Map<String, Object> requestContext = > ((BindingProvider)port).getRequestContext(); > AddressingProperties maps = new AddressingPropertiesImpl(); > requestContext.put(CLIENT_ADDRESSING_PROPERTIES, maps); > > AttributedURIType messageID = > WSA_OBJECT_FACTORY.createAttributedURIType(); > messageID.setValue("urn:uuid:" + System.currentTimeMillis()); > maps.setMessageID(messageID); > > Map<String, Object> requestContext = new HashMap<String, > Object>(); > requestContext.put(CLIENT_ADDRESSING_PROPERTIES, maps); > > factory.setProperties( requestContext ); > > > But at the Interceptor portion, ContextUtils.isOutbound(message) always > returns false, and ContextUtils.retrieveMAPs(message, true, true) returns > null. I feel like I'm missing something fundamental here from a > configuration standpoint. > > > Cheers, > Jason. > > > > 2009/11/4 Eoghan Glynn <[email protected]> > > > > Unless I'm mistaken, I should > > > try to modify the message at the WRITE phase? > > > > No, that would be too late as the WS-A codec interceptor would have > already > > run in the PRE_PROTOCOL phase, i.e. the message addressing properties > would > > already have been marshalled up using the default WS-A version by the > time > > your WRITE interceptor runs. > > > > So probably best to run it in the same phase as the WS-A interceptor > > responsible for aggregating the properties, straight after that > interceptor > > has been traversed: > > > > public class MyInterceptor extends AbstractSoapInterceptor { > > public MyInterceptor() { > > super(Phase.PRE_LOGICAL); > > addAfter(MAPAggregator.class.getName()); > > } > > > > You also need to be careful that you only modify on the outbound leg, so > > handleMessage should probably look something like: > > > > public void handleMessage(SoapMessage arg0) throws Fault > > { > > Message message = arg0.getMessage(); > > if (ContextUtils.isOutbound(message)) { > > AddressingPropertiesImpl outMaps = > > ContextUtils.retrieveMAPs(message, true, true); > > if (outMaps != null) { > > > > outMaps.exposeAs(VersionTransformer.Names200408.WSA_NAMESPACE_NAME); > > } > > } > > } > > > > Cheers, > > Eoghan > > > > 2009/11/3 Jason Clark <[email protected]> > > > > > Thanks Eoghan, > > > > > > Maybe I'll try to go the interceptor route. Unless I'm mistaken, I > > should > > > try to modify the message at the WRITE phase? > > > > > > I've updated my code: > > > > > > MyInterceptor myInterceptor = new MyInterceptor(); > > > > > > ClientProxyFactoryBean factory = new > ClientProxyFactoryBean(); > > > factory.setServiceClass(OrderServiceSoap.class); > > > factory.setAddress(" > > > https://uatwebservice.jcorp.com/OrderService.asmx"); > > > factory.getFeatures().add( new WSAddressingFeature() ); > > > factory.getOutInterceptors().add( myInterceptor ); > > > > > > OrderServiceSoap os = (OrderServiceSoap) factory.create(); > > > > > > os.getStudy( 234 ); > > > > > > where my interceptor class is: > > > > > > public class MyInterceptor extends AbstractSoapInterceptor { > > > public MyInterceptor() { > > > super(Phase.WRITE); > > > } > > > > > > @Override > > > public void handleMessage(SoapMessage arg0) throws Fault > > > { > > > AddressingPropertiesImpl inMaps = > > > RMContextUtils.retrieveMAPs(arg0.getMessage(),false, false); > > > > > > inMaps.exposeAs(VersionTransformer.Names200408.WSA_NAMESPACE_NAME); > > > } > > > } > > > > > > which is throwing the exception: > > > > > > WARNING: WS-Addressing - failed to retrieve Message Addressing > Properties > > > from context > > > Nov 3, 2009 2:17:26 PM org.apache.cxf.phase.PhaseInterceptorChain > > > doIntercept > > > WARNING: Interceptor has thrown exception, unwinding now > > > > > > > > > I thought this: > > > factory.getFeatures().add( new WSAddressingFeature() ); > > > > > > would create the addressing properties? I think I missing something > > pretty > > > major here. > > > > > > Cheers, > > > Jason. > > > > > > > > > > > > 2009/11/3 Eoghan Glynn <[email protected]> > > > > > > > Jason, > > > > > > > > Our support for WS-A 2004/08 was added specifically for the CXF WS-RM > > > > implementation, as WS-RM 1.0 depended on that older version of WS-A. > > > > > > > > As a result the mechanism for enabling this feature is a tad > > unfriendly, > > > > requiring an API call on the AddressingProperties to specify the WS-A > > > > version you require. > > > > > > > > See for example how the WS-RM code calls this exposeAs() API: > > > > > > > > > > > > > > > > > > http://svn.apache.org/repos/asf/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMManager.java > > > > > > > > AddressingPropertiesImpl inMaps = > RMContextUtils.retrieveMAPs(message, > > > > false, false); > > > > > > > > inMaps.exposeAs(VersionTransformer.Names200408.WSA_NAMESPACE_NAME); > > > > > > > > You could write a simple interceptor to run after the WS-A > > MapAggregator > > > > which takes a similar approach to the above. > > > > > > > > Cheers, > > > > Eoghan > > > > > > > > > > > > 2009/11/3 Jason Clark <[email protected]> > > > > > > > > > Hello all, > > > > > > > > > > Has anyone here had an opportunity to use the 2004/08 version of > > > > > WS-Addressing (http://schemas.xmlsoap.org/ws/2004/08/addressing). > > > > > > > > > > The service I'm attempting to connect to will only accept that > > version. > > > > I > > > > > see on http://cwiki.apache.org/CXF20DOC/ws-addressing.html that > "CXF > > > > > provides support for the 2004-08 and 1.0 versions of > WS-Addressing.", > > > but > > > > > haven't been able to determine what it is I need to do to change > it. > > > > > > > > > > In Axis2 1.4, I'm able to explicitly specify the version by : > > > > > > > > > > > > > > > > > > > > > > > > > options.setProperty(org.apache.axis2.addressing.AddressingConstants.WS_ADDRESSING_VERSION, > > > > > > > > > > > > > > > org.apache.axis2.addressing.AddressingConstants.Submission.WSA_NAMESPACE); > > > > > > > > > > > > > > > With CXF, I've set up WS-Addressing with: > > > > > > > > > > ClientProxyFactoryBean factory = new > > > ClientProxyFactoryBean(); > > > > > factory.setServiceClass(OrderServiceSoap.class); > > > > > factory.setAddress(" > > > > > https://webservice.jcorp.com/OrderService.asmx"); > > > > > factory.getFeatures().add(new WSAddressingFeature() ); > > > > > > > > > > And when I examine the raw request, I see: > > > > > > > > > > <soap:Envelope xmlns:soap=" > http://schemas.xmlsoap.org/soap/envelope/ > > "> > > > > > <soap:Header> > > > > > <Action xmlns="*http://www.w3.org/2005/08/addressing*"> > > > > > > > http://service.jcorp.com/OrderServiceSoapPortType/getStudy > > > > > </Action> > > > > > <MessageID xmlns="*http://www.w3.org/2005/08/addressing*"> > > > > > > urn:uuid:a559ae80-d667-4795-8d74-3e3c2319d1b3</MessageID> > > > > > <To xmlns="http://www.w3.org/2005/08/addressing"> > > > > > https://service.jcorp.com/OrderService.asmx > > > > > </To> > > > > > <ReplyTo xmlns="http://www.w3.org/2005/08/addressing"> > > > > > <Address>http://www.w3.org/2005/08/addressing/anonymous > > > > > </Address> > > > > > </ReplyTo> > > > > > </soap:Header> > > > > > <soap:Body> > > > > > <ns1:getStudy xmlns:ns1="http://service.jcorp.com/"> > > > > > <ns2:arg0 xmlns="http://jcorp.com/service" > > > > > xmlns:ns2="http://service.jcorp.com/ > ">234</ns2:arg0> > > > > > </ns1:getStudy> > > > > > </soap:Body> > > > > > </soap:Envelope> > > > > > > > > > > So it's attempting to do the right thing. Could someone please > point > > > me > > > > in > > > > > the right direction? > > > > > > > > > > > > > > >
