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

Reply via email to