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

Reply via email to