Uploaded image for project: 'Axis'
  1. Axis
  2. AXIS-2135

CastorSerializer 1.2/1.2.1 does not handle arrays correctly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 1.2, 1.2.1
    • None
    • None

    Description

      It seems that new Castor Serializer for Axis 1.2/1.2.1 does not handle arrays correctly (it works fine in 1.1).

      Here is the SOAP envelope produced by the serializer:

      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ "
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance ">
      <soapenv:Body>
      <getSubscribersResponse xmlns="http://xml.spss.com/notification/remote">
      <ns1:subscriber[0,unbounded] enabled="true" principalID="\SPSS\dvasilen" xmlns:ns1=" http://xml.spss.com/notification">
      <ns1:identifier>0a0a483801584807000001053a13f207800e</ns1:identifier>
      </ns1:subscriber[0,unbounded]>
      </getSubscribersResponse>
      </soapenv:Body>
      </soapenv:Envelope>

      Note that array boundaries are included in the XML as [0,unbounded].
      The XML parser throws the following exception when tries to parse this invalid XML

      org.xml.sax.SAXParseException: Element type "ns1:subscriber" must be followed by either attribute specifications, ">" or "/>".
      AxisFault
      faultCode:

      {http://schemas.xmlsoap.org/soap/envelope/}

      Server.userException
      faultSubcode:
      faultString: org.xml.sax.SAXParseException: Element type "ns1:subscriber" must be followed by either attribute specifications, ">" or "/>".
      faultActor:
      faultNode:
      faultDetail:

      {http://xml.apache.org/axis/}

      stackTrace:org.xml.sax.SAXParseException: Element type "ns1:subscriber" must be followed by either attribute specifications, ">" or "/>".
      at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
      at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
      at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
      at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
      at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
      at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
      at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
      at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
      at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
      at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
      at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
      at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
      at org.apache.axis.Message.getSOAPEnvelope(Message.java:424)
      at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
      at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
      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.spss.notification.ws.axis.SubscriptionRepositoryServiceStub.getSubscribers(SubscriptionRepositoryServiceStub.java:2120)

      The correct envelope should look like this

      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ "
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance ">
      <soapenv:Body>
      <getSubscribersResponse xmlns="http://xml.spss.com/notification/remote">
      <ns1:subscriber enabled="true" principalID="\SPSS\dvasilen" xmlns:ns1=" http://xml.spss.com/notification">
      <ns1:identifier>0a0a483801584807000001053a13f207800e</ns1:identifier>
      </ns1:subscriber>
      </getSubscribersResponse>
      </soapenv:Body>
      </soapenv:Envelope>

      The quick fix is the change

      marshaller.setRootElement(name.getLocalPart());

      to

      String localPart = name.getLocalPart();
      int arrayDims = localPart.indexOf('[');
      if (arrayDims != -1)

      { localPart = localPart.substring(0, arrayDims); }

      marshaller.setRootElement(localPart);

      in the org.apache.axis.encoding.ser.castor.CastorSerializer

      Attachments

        1. castor_serializer_diffs.zip
          2 kB
          Dmitry Vasilenko
        2. castor_serializer.zip
          11 kB
          Dmitry Vasilenko
        3. patchfile.txt
          4 kB
          Dmitry Vasilenko

        Activity

          People

            Unassigned Unassigned
            dvasilen Dmitry Vasilenko
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: