Thanks Deepal, I now have my handler running in the appropriate phase - I even dispensed with the module / mar file and put the handler config directly in my axis2.xml, which makes things easier for me. Your tip also solved my multiple config issue - I just initialise the stubs with the custom auth mechanism with my axis2.xml and use the default for everything else.
My last question is, where is a good place to store the authentication token for subsequent calls? Ideally I'd like it to live somewhere inside the stub. To clarify: - I create the stub and make the login() call - InFlow Handler gets the authentication token and stores it (one auth token per target endpoint and there are several) - where? - I make another call - OutFlow Handler needs to find the auth token - from where? At the moment I've hacked something together with static members on the handler but it's ugly and wrong. Any suggestions? All I have to start with is the MessageContext. Regards, Stephanos Piperoglou Price Control GTO - BAC IT +44 20 754 59007 This mail is transmitted to you on behalf of the Great East London Software Company Diese Post wird Ihnen im Namen der Great East London Software Company übermittelt Deepal Jayasinghe <dee...@opensource.lk> 16/10/2010 04:32 Please respond to java-user@axis.apache.org To java-user@axis.apache.org cc Subject Re: Custom handler for header with mustUnderstand=true On 10/15/2010 9:50 AM, Stephanos Piperoglou wrote: Hi everyone, I'm trying to use Axis2 to build a client that communicates with a third-party web service that uses a proprietary authentication mechanism involving a SOAP header. It works like this: 1. You call a login() method in the usual way (no extra headers) and the SOAP envelope in the response contains a header (with mustUnderstand="true") with an authentication token 2. Subsequent request need to contain this token in an authentication header I've created an ADB stub using wsdl2java and (after a bit of tinkering to set Expect: 100-continue HTTP header) I am able to call the login() method but the client chokes on the header in the response: Exception in thread "Main Thread" java.lang.NullPointerException at org.apache.axis2.engine.AxisEngine.checkMustUnderstand( AxisEngine.java:97) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:163) at org.apache.axis2.description.OutInAxisOperationClient.handleResponse( OutInAxisOperation.java:364) at org.apache.axis2.description.OutInAxisOperationClient.send( OutInAxisOperation.java:417) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl( OutInAxisOperation.java:229) at org.apache.axis2.client.OperationClient.execute( OperationClient.java:165) at com.db.pvsax.idssoap.MarketDataServiceStub.loginXML( MarketDataServiceStub.java:849) at com.db.pvsax.idssoap.IdsSample.main(IdsSample.java:24) From what I can gather I need to write a module with a handler that will deal with this error. I wrote a Module and a Handler class, created module.xml, packaged them all into a .mar file put that and an axis2.xml (with references to the module and the new phases) in the classpath but nothing seems to be changing. Questions for you fine people: 1. How can I figure out why my handler isn't being invoked? Is it enough to put axis2.xml in the classpath? Any way to confirm (e.g. via debug logging) that the module is being loaded? This is not enough, if you change the default axis2.xml, then you need to create your stub with that axis2.xml. Create a configurationContext by pointing to your axis2.xml and the create the stub using that configuration context. 2. How can my handler tell Axis that it understood the mustUnderstand header to prevent the NPE above? Once you process the soap header, you can set the processed flag to true. 3. How can I configure the handler to only be used with this particular web service and not the others I access from the same system that don't have this authentication system? axis2.xml seems to be a global config that would break everything else. If there is a name space or something in the header then you can use that as a way of telling your handle. Another option is to configure it to use the URL based filtering. Regards, Stephanos Piperoglou Price Control GTO - BAC IT +44 20 754 59007 This mail is transmitted to you on behalf of the Great East London Software Company Diese Post wird Ihnen im Namen der Great East London Software Company übermittelt --- This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. Please refer to http://www.db.com/en/content/eu_disclosures.htm for additional EU corporate and regulatory disclosures. --- This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. Please refer to http://www.db.com/en/content/eu_disclosures.htm for additional EU corporate and regulatory disclosures.