Hey Simon, Thx for the tip, all working now :-)
That did the trick, I'm still casting to a org.apache.axis.MessageContext object from javax.xml.rpc.handler.MessageContext in the handleResponse as I need the richer set of the methods to obtain the response message etc. Cheers, -Jonathan -----Original Message----- From: Jonathan Bruce [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 19:47 To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 This is probably the issue: I'm implementing the org.apache.axis.handlers.BasicHandler interface... Let me re-code with your suggestion, and I'll get back to you. -Jonathan -----Original Message----- From: Simon Fell [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 18:17 To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 Does your handler class implement the javax.xml.rpc.handler.Handler interface ? Cheers Simon -----Original Message----- From: Jonathan Bruce [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 3:14 PM To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 Hey Simon, Something is not quite right unfortunately. I looks like my Handler is not registering correctly and as a result I get the following stack trace. Unexpected error: ; nested exception is: javax.xml.rpc.JAXRPCException: Unable to create handler of type class com.jmb.axis.handlers.MyHandler AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: javax.xml.rpc.JAXRPCException: Unable to create handler of type class com.jmb.axis.handlers.MyHandler faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:javax.xml.rpc.JAXRPCException: Unable to create handler of type class com.jmb.axis.handlers.MyHandler at org.apache.axis.handlers.HandlerChainImpl.newHandler(HandlerChainImpl.ja va:247) at org.apache.axis.handlers.HandlerChainImpl.<init>(HandlerChainImpl. java:77) at org.apache.axis.handlers.HandlerInfoChainFactory.createHandlerChain(Hand lerInfoChainFactory.java:42) at org.apache.axis.client.AxisClient.getJAXRPChandlerChain(AxisClient.java: 274) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:140) at org.apache.axis.client.Call.invokeEngine(Call.java:2765) at org.apache.axis.client.Call.invoke(Call.java:2748) at org.apache.axis.client.Call.invoke(Call.java:2424) at org.apache.axis.client.Call.invoke(Call.java:2347) at org.apache.axis.client.Call.invoke(Call.java:1804) at com.sforce.soap.enterprise.SoapBindingStub.login(SoapBindingStub.java:15 07) at com.jmb.SFTest.setUp(SFTest.java:86) at junit.framework.TestCase.runBare(TestCase.java:125) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe stRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun ner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu nner.java:196) {http://xml.apache.org/axis/}hostname:nc-jbruce2 So far I have extended the SforceServiceLocator class and with my own class that includes a single method that adds the handler as follows: HandlerRegistry hr = this.getHandlerRegistry(); QName soap = new QName(this.getSoapWSDDServiceName()); ArrayList handlerChain = new ArrayList(); QName[] headers = null; HandlerInfo handler = new HandlerInfo(com.jmb.axis.handlers.MyHandler.class, null, headers); handlerChain.add(handler); hr.setHandlerChain(soap, handlerChain); And I'm initializing the Sforce handle as you'd expect... ServiceLocatorXMLHandler slXML = new ServiceLocatorXMLHandler(); slXML.addHandler(); // adds handler as above binding = (SoapBindingStub)slXML.getSoap(); In debugging it is clear that my registration of the my Handler class is working correctly, however this may be a simple class loading issue. I have this is a Junit framework, so perhaps thay may be causing an issue. I have so far failed to dig up any reasonable explanation for this. Any thoughts? Cheers, -Jonathan -----Original Message----- From: Simon Fell [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 14:07 To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 I use this.getSoapWSDDServiceName() for the service name. -----Original Message----- From: Jonathan Bruce [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 11:01 AM To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 Hey Simon, Sounds good, I definitly prefer leaving the stubs alone and modifying the Handler chain at the service level. One question however. What should the 'serviceName' variable be equal to in the Qname instantiation? -Jonathan -----Original Message----- From: Simon Fell [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 13:02 To: [email protected] Subject: RE: Adding Handlers to Axis 1.2.1 Hi Jonathan, I haven't tried this with 1.2.1 yet, but I have a client side handler that does something similar in Axis 1.1, this works fine for me. SOAPMessageContext sc = (SOAPMessageContext)ctx; SOAPEnvelope env = sc.getMessage().getSOAPPart().getEnvelope(); checkResponse(env.toString()); Although I hook it into the chain at the service level rather than changing the generated stub (by subclassing the generated ServiceLocator class) HandlerRegistry hr = this.getHandlerRegistry(); QName soap = new QName(serviceName); ArrayList handlerChain = new ArrayList(); HandlerInfo handler = new HandlerInfo(LoggingHandler.class, null, null); handlerChain.add(handler); hr.setHandlerChain(soap, handlerChain); Not entirely answering your question, but hope it helps Cheers Simon -----Original Message----- From: Jonathan Bruce [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 12, 2005 7:51 AM To: [email protected] Subject: Adding Handlers to Axis 1.2.1 Hi, I've recently built a set of client stubs from a Salesforce.com WSDL tailored for my company. I however need to gain access to the RAW XML returned by interactions with the SFDC API, figured adding a Handler was the best way to go. I added the 'setClientHandlers' call to a specific generated stub class prior to the invoke() call. org.apache.axis.client.Call _call = createCall(); : : _call.setClientHandlers(null, responseHandler); My handler looks something like this: package com.jmb.axis.handlers; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.*; import javax.xml.*; import javax.xml.parsers.*; import org.w3c.dom.Document; import org.xml.sax.InputSource; import java.io.*; public class MyHandler extends BasicHandler { private String bodyXML; /** * Mandatory method. Required by BasicHandler super-class * */ public void invoke(MessageContext ctx) { try { bodyXML = ctx.getMessage().getSOAPPart().getEnvelope().getBody().toString(); // Hand off to another program anyway you like. Don't have to work with string, // getBody() will return a SOAPBody object which extends a SOAPElement object // which extends a SOAPNode } catch (Exception e) { e.printStackTrace(); } } /** * @return */ public Document buildDOM() { Document document = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); //InputSoure is = new InputStream(); StringReader reader = new StringReader(this.bodyXML); document = parser.parse(new InputSource(reader)); } catch (Exception e) { e.printStackTrace(); } return document; } /** * */ public String toString() { return bodyXML; } } This causes a problem in the parsing of the SOAP response, however, as the following exception is thrown (stack trace follows) - Exception: org.xml.sax.SAXException: Invalid element in com.sforce.soap.enterprise.sobject.SObject - CloseDate at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeseriali zer.java:258) at org.apache.axis.encoding.DeserializationContext.startElement(Deserializa tionContext.java:1035) at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java: 165) at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.j ava:1141) at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236) at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384) at org.apache.axis.client.Call.invoke(Call.java:2448) at org.apache.axis.client.Call.invoke(Call.java:2347) at org.apache.axis.client.Call.invoke(Call.java:1804) at com.sforce.soap.enterprise.SoapBindingStub.query(SoapBindingStub.java:20 91) at com.jmb.SFTest.testQuery1(SFTest.java:409) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav a:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe stRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun ner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu nner.java:196) AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXException: Invalid element in com.sforce.soap.enterprise.sobject.SObject - CloseDate faultActor: faultNode: faultDetail: I am not sure what is happening here, but it is possible that by outputting the message from the MessageContext, I may need to reset the parser to read from the beginning of the SOAP response? Any suggestions very welcome! Cheers, -Jonathan
BEGIN:VCARD VERSION:2.1 N:Bruce;Jonathan FN:Jonathan Bruce EMAIL;PREF;INTERNET:[EMAIL PROTECTED] REV:20050222T172123Z END:VCARD
