first off, i have a very complex schema. ive implemented the validation handler to validate xml documents coming in. that works perfectly. the problem is the way Jibx handles null values that are required is giving me and my developers heart burn. it returns null exception, we can see what class the null exception happens in the log file, but it doesn't say what field is null. so my solution was in my binder file set all the fields to optional and add outgoing schema validation to my validation handler. reason for that is hopefully it will generate a soap fault and tell us exactly what field is wrong just like it does on incoming requests.
here's my problem. my schema has over 33 namespaces in it. the way the binder.xml had to be set up to handle so many namespaces, i had to declare them all at the top of the file then use the NS attribute to indicate what namespace a specific element was. the drawback is that when jibx generates an xml response, it includes all 33 namespaces in the return when it only needs to return at most four of them (maybe feature for next version?) that brings me to the error im getting on outbound xml validation. i have everything configured correctly and i get this exception 2008-11-06 19:10:09,953 [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' ERROR org.apache.axis2.transport.http.AxisServlet - 32 java.lang.ArrayIndexOutOfBoundsException: 32 at com.ctc.wstx.util.BijectiveNsMap.addMapping(BijectiveNsMap.java:247) at com.ctc.wstx.sw.SimpleOutputElement.addPrefix(SimpleOutputElement.java:359) at com.ctc.wstx.sw.SimpleNsStreamWriter.doSetPrefix(SimpleNsStreamWriter.java:163) at com.ctc.wstx.sw.BaseNsStreamWriter.setPrefix(BaseNsStreamWriter.java:183) at org.apache.axiom.om.impl.MTOMXMLStreamWriter.setPrefix(MTOMXMLStreamWriter.java:249) at org.apache.axiom.om.impl.util.OMSerializerUtil.generateSetPrefix(OMSerializerUtil.java:636) at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeStartpart(OMSerializerUtil.java:296) at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeStartpart(OMSerializerUtil.java:197) at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:901) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:641) at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:889) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerialize(OMSourcedElementImpl.java:623) at org.apache.axiom.om.impl.llom.OMNodeImpl.serialize(OMNodeImpl.java:450) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.serialize(OMSourcedElementImpl.java:699) at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.serialize(OMSourcedElementImpl.java:681) at com.sosnoski.axis2.handler.ValidateHandler.invoke(ValidateHandler.java:169) at org.apache.axis2.engine.Phase.invoke(Phase.java:317) at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:264) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:429) at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:43) at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:131) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3370) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(Unknown Source) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2117) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2023) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1359) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) at weblogic.work.ExecuteThread.run(ExecuteThread.java:172) here is an example of the xml document that jibx generates that im trying to validate against <?xml version="1.0" encoding="UTF-8"?> <tccioresp:Response xmlns:tccioresp="ns1" xmlns:com="ns2" xmlns:gcpreq="ns3" xmlns:gcpresp="ms4" xmlns:gcvreq="ns5" xmlns:gcvresp="ns6" xmlns:giareq="ns7" xmlns:giaresp="ns8" xmlns:grreq="ns9" xmlns:grresp="ns10" xmlns:gtdreq="ns11" xmlns:gtdresp="ns12" xmlns:tavreq="ns13" xmlns:tavresp="ns14" xmlns:tccioreq="ns15" xmlns:tdrreq="ns16" xmlns:tdrresp="ns17" xmlns:tereq="ns18" xmlns:teresp="ns19" xmlns:titreq="ns20" xmlns:titresp="ns21" xmlns:tmmrreq="ns22" xmlns:tmmrresp="ns23" xmlns:tprreq="ns24" xmlns:tprresp="ns25" xmlns:tstreq="ns26" xmlns:tstresp="ns27" xmlns:tvrreq="ns28" xmlns:tvrresp="ns29" xmlns:tvtreq="ns30" xmlns:tvtresp="ns31" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Response> <com:TxnRetCode>1</com:TxnRetCode> <com:TxnSubRetCode>1017</com:TxnSubRetCode> <com:TxnErrorText>The card number provided is invalid</com:TxnErrorText> </Response> <TranID>0</TranID> <TranStatus>REJCTD</TranStatus> <CardNumber>0</CardNumber> </tccioresp:Response> remember, of all those namespaces declared, only 4 of them are actually needed. the rest are only there for show i guess. now here is the line of code that its excepting on ByteArrayOutputStream baos = new ByteArrayOutputStream(); content.build(); content.serialize(baos); byte[] bytes = baos.toByteArray(); its the content.serialize(baos); line that the exception is occuring on. now the REALLY weird thing is i have written into my junits a validation routine that validates the response from the web service and it works just fine with all those namespaces. import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.w3c.dom.ls.LSResourceResolver; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; those are the imports for my junit validator import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import javax.xml.XMLConstants; import javax.xml.stream.XMLStreamException; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; those are the imports from my handler. i build the one for the junits based on the code for the handler so they are virutally identical. the only major difference is that the handler starts with a context object and the junits start with a string. why would one work and the other not? if you could tell me whats going on here it would help me out a lot. thanks willie ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ jibx-users mailing list jibx-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jibx-users