Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to solve SAXException: Invalid element in

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?

like image 552
Jeremy Knees Avatar asked Apr 18 '13 18:04

Jeremy Knees


3 Answers

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.

like image 99
Guillaume Husta Avatar answered Oct 18 '22 22:10

Guillaume Husta


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.

like image 22
Roberto Rodriguez Avatar answered Oct 18 '22 20:10

Roberto Rodriguez


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"));
like image 28
Devrim Avatar answered Oct 18 '22 21:10

Devrim