JAX-WS: ORA-31011
Dennis GuseToday, I tried to do something useful for my bachelor thesis. I tried to query a Oracle 11G DBMS via a SOAP-based Webservice. Using the instruction from Andrea and Oracle I got the service up and running. The Webservice was reachable under http://localhost:8080/orawsv and presented it’s wsdl via http://localhost:8080/orawsv?wsdl.
Now the trouble started: The URL from the Oracle HTTP-Server is secured via HTTP-Authentification. Ok so I downloaded the WSDL and created the stubs from a local file with the JDK’s wsimport. Now I needed to tell the Webservice Client Provider to authenticate if necessary:
1
2
3
4
ORAWSVPortType port = new ORAWSVService().getORAWSVPort();
Map<String, Object>; requestCtx = ((BindingProvider) port).getRequestContext();
requestCtx.put(BindingProvider.USERNAME_PROPERTY, "user");
requestCtx.put(BindingProvider.PASSWORD_PROPERTY, "password");
The first test ended with a desaster:
Exception in thread “main” java.lang.IllegalArgumentException: faultCode argument for createFault was passed NULL at com.sun.xml.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl.createFault(SOAPFactory1_1Impl.java:56) at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:108) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:254) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:224) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:117) at $Proxy32.xmlFromQuery(Unknown Source) at productcatalogws.Main.main(Main.java:49) Java Result: 1
I couldn’t make anything useful out of these messages. The only thing I found was a dead end: bug_id=6587659. So I started debugging: First view the SOAPMessages: I used the cool charles proxy.
Configuration for JAVA:
1
2
3
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "localhost");
System.getProperties().put("proxyPort", "8888");
After viewing the messages without noticing anything of interesst except: ORA-31011: XML parsing error, but without any reference to the Webservice.
I found a cool tool to use webservices: soapUI (you can do everything I needed using it!!) and queried the Oracle Webservice by hand. And it worked!
The problem was that the default JAX-WS Provider does send:
Content-Type: text/xml;charset=”utf-8”
And the Oracle HTTP Server expects:
Content-Type: text/xml;charset=UTF-8
An example SOAPMessage (including the header):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Authorization: Basic XXXXX
Host: localhost:8080
Content-Length: 314
SOAPAction: "<a href="http://localhost:8080/orawsv">http://localhost:8080/orawsv</a>"
User-Agent: Jakarta Commons-HttpClient/3.0.1
Content-Type: text/xml;charset=UTF-8
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:oraw="http://xmlns.oracle.com/orawsv">
<soapenv:Header>
<soapenv:Body>
<oraw:query>
<oraw:query_text type="SQL">SELECT * FROM PRODUCT</oraw:query_text>
</oraw:query>
<soapenv:Body>
</soapenv:Envelope>
The questions are:
- Does JAX-WS something wrong during the request or is the DB Webservice the bad guy?
- And why doesn’t JAX-WS handle the SOAPfault correctly?
Used software: javac –version:
java version “1.6.0_04” Java(TM) SE Runtime Environment (build 1.6.0_04-b12) Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode)
Oracle 11G DBMS: Oracle Database 11 g Release 1 for 32-bit Windows.