How to solve SAXException: Invalid element in

26,437

Solution 1

This could be related to this bug (AXIS-2758), unresolved with Axis 1.x.

This problem can appear if your client stub is not up to date with the server side (the WSDL file). You could have to re-generate it. Like with axistools:wsdl2java.

The best nowadays, provided you use at least Java 6, is maybe to use JAX-WS on the client side (JAX-WS Maven Plugin). But it could not work with old SOAP Services using RPC/Encoded... Prefer the Document/Literal style.

Solution 2

Workaround for this problem:

Open your generated class(For this question it is librarysearch.soft.Book). See the static code block which defines the properties(name, type, etc.) of fields.

You'll something like below:

elemField.setXmlName(new javax.xml.namespace.QName("", "book"));

change it by adding namespaceURI to it (use same namespameURI which is used at setXmlType call):

elemField.setXmlName(new javax.xml.namespace.QName("http://your.namespaceuri.here", "book"));

Solution 3

I had the same problem and after trying the Web Service using SoapUI, I discovered two inconsistencies between the fields I was getting in the response and the fields generated by the WSDL:

1- For some reason, when I generated my structure from the WSDL, it put a space after the field name, like this:

elemField.setXmlName(new javax.xml.namespace.QName("http://namespaceuri.here", "book "));

I just removed that space and it fixed the problem.

2- In the response I was getting an additional field that was not present in my class. What I did here was to add the field to my class, and to add also in the static block, just like any other field.

Hope it helps.

Share:
26,437
Jeremy Knees
Author by

Jeremy Knees

Updated on September 08, 2020

Comments

  • Jeremy Knees
    Jeremy Knees almost 4 years

    I try to get results from a webservice in the following way.

    List result = new Vector();
    LibrarySearchRequest request = new LibrarySearchRequest(queryString);
    LibrarySearchServicePortTypeProxy proxy = 
                                    new LibrarySearchServicePortTypeProxy();
    LibrarySearchServicePortType port = proxy.getLibrarySearchServicePortType();
    LibrarySearchResponse response = port.process(request);
    librarysearch.soft.Book[] books = response.getBooks();
    

    When I do this I get the following exception (stacktrace) :

    org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
    at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
    at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
    at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
    at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java: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:2467)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at librarysearch.soft.LibrarySearchServiceSOAP11BindingStub.process(LibrarySearchServiceSOAP11BindingStub.java:180)
    at softarch.portal.db.ws.WS_RegularDatabase.findRecords(WS_RegularDatabase.java:44)
    at softarch.portal.db.test.TestWSRegularDatabase.main(TestWSRegularDatabase.java:39)
    
    The regular database has caught an unexpected exception: ; nested exception is: 
    org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
    

    I read the problem could be caused by the result returned from the webservice not matching with the classes generated from the wsdl. I regenerated my webservice client but no succes. What else could be the problem?