Scott Kurz wrote:
The root cause here seems to be the same or similar to the one in:
https://issues.apache.org/jira/browse/TUSCANY-2479
(not that pointing that out brings us closer to a solution).
I did also discover that externalizing every schema the way wsgen's WSDL
output does leads to another problem:
https://issues.apache.org/jira/browse/TUSCANY-2481
though I'd guess the latter shouldn't be too hard to fix.
Scott
On Fri, Jul 18, 2008 at 5:01 PM, Raymond Feng <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
Hi,
The bottom of the problem is as follows:
1) The WSDL has more than one inline schemas with different target
namespaces.
2) An inline schema references the other inline schema for XSD types
or elements.
We are supposed to have <xsd:import> statements in the inline schemas.
I don't think it's the lack of xsd:import that's causing this problem.
The schema definition for http://jaxb.databindings.itest.sca.tuscany.apache.org/
is referencing types using an ns0: prefix, which resolves to http://util.java/.
However, there is no schema definition with this targetNamespace. The first
thing that needs fixing is to add targetNamespace="http://util.java/" to the
first schema definition (the one that defines arrayList etc.) and see if
that resolves the problem.
Vamsi, could you try editing the generated WSDL to add this targetNamespace
attribute and see if the modified WSDL can be loaded by the Tuscany runtime?
If this works, we need to figure out why the first schema is (apparently)
coming back from JAXB without a targetNamespace specified.
Simon
There are a few issues:
1) No <xsd:import> statements are generated by our J2W. IMO, the
<xsd:import> is required.
2) There is no standard way to specify the @schemaLocation for the
<xsd:import> to reference another inline schema. I have personally
seen different behaviors from various runtimes and tools, for example:
* wsimport uses the #types?schemaN
* EMF parser automatically search the inline schemas to match the
<xsd:imports> if no @schemaLocation is present
We have to figure out:
1) What style of WSDL with multiple XSDs to be generated? Inline all
XSDs (one file) or externalize all XSDs (WSDL and XSD files need to
be downloaded from ?wsdl URL)?
2) What's the most compatible style of the @schemaLocation if
<xsd:import> or <xsd:include> is needed?
Thanks,
Raymond
*From:* Vamsavardhana Reddy <mailto:[EMAIL PROTECTED]>
*Sent:* Friday, July 18, 2008 1:11 PM
*To:* [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
*Subject:* Problem using wsdl generated by ?wsdl with interface.wsdl
as well as wsimport
I have the following java interface:
package org.apache.tuscany.sca.itest.databindings.jaxb;
@Remotable
public interface HelloService {
String getGreetings(String name);
String[] getGreetingsArray(String[] names);
List<String> getGreetingsList(List<String> names);
ArrayList<String> getGreetingsArrayList(ArrayList<String> names);
Map<String, String> getGreetingsMap(Map<String, String> namesMap);
HashMap<String, String> getGreetingsHashMap(HashMap<String,
String> namesMap);
String getGreetingsVarArgs(String... names);
}
I have obtained the following wsdl using ?wsdl on a service which
uses interface.java with the above interface:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="HelloService"
targetNamespace="http://jaxb.databindings.itest.sca.tuscany.apache.org/"
xmlns:tns="http://jaxb.databindings.itest.sca.tuscany.apache.org/"
xmlns:soap11="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xs:schema version="1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="arrayList">
<xs:complexContent>
<xs:extension base="abstractList">
<xs:sequence />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractList">
<xs:complexContent>
<xs:extension base="abstractCollection">
<xs:sequence />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractCollection">
<xs:sequence />
</xs:complexType>
<xs:complexType name="hashMap">
<xs:complexContent>
<xs:extension base="abstractMap">
<xs:sequence />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractMap">
<xs:sequence />
</xs:complexType>
</xs:schema>
<xs:schema targetNamespace="http://jaxb.dev.java.net/array"
version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType final="#all" name="stringArray">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0"
name="item" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://jaxb.databindings.itest.sca.tuscany.apache.org/"
xmlns:ns0="http://util.java/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getGreetings">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsArray">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0"
name="arg0" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsArrayResponse">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0"
name="return" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsList">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0"
nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsListResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsArrayList">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0"
nillable="true" type="ns0:arrayList" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsArrayListResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="ns0:arrayList" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsMap">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0"
nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsMapResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsHashMap">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0"
nillable="true" type="ns0:hashMap" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsHashMapResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="ns0:hashMap" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsVarArgs">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0"
name="arg0" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getGreetingsVarArgsResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="getGreetings">
<wsdl:part name="getGreetings" element="tns:getGreetings">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsResponse">
<wsdl:part name="getGreetingsResponse"
element="tns:getGreetingsResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsArray">
<wsdl:part name="getGreetingsArray"
element="tns:getGreetingsArray">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsArrayResponse">
<wsdl:part name="getGreetingsArrayResponse"
element="tns:getGreetingsArrayResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsList">
<wsdl:part name="getGreetingsList"
element="tns:getGreetingsList">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsListResponse">
<wsdl:part name="getGreetingsListResponse"
element="tns:getGreetingsListResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsArrayList">
<wsdl:part name="getGreetingsArrayList"
element="tns:getGreetingsArrayList">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsArrayListResponse">
<wsdl:part name="getGreetingsArrayListResponse"
element="tns:getGreetingsArrayListResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsMap">
<wsdl:part name="getGreetingsMap"
element="tns:getGreetingsMap">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsMapResponse">
<wsdl:part name="getGreetingsMapResponse"
element="tns:getGreetingsMapResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsHashMap">
<wsdl:part name="getGreetingsHashMap"
element="tns:getGreetingsHashMap">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsHashMapResponse">
<wsdl:part name="getGreetingsHashMapResponse"
element="tns:getGreetingsHashMapResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsVarArgs">
<wsdl:part name="getGreetingsVarArgs"
element="tns:getGreetingsVarArgs">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getGreetingsVarArgsResponse">
<wsdl:part name="getGreetingsVarArgsResponse"
element="tns:getGreetingsVarArgsResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="HelloService">
<wsdl:operation name="getGreetings">
<wsdl:input message="tns:getGreetings"></wsdl:input>
<wsdl:output message="tns:getGreetingsResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsArray">
<wsdl:input message="tns:getGreetingsArray"></wsdl:input>
<wsdl:output message="tns:getGreetingsArrayResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsList">
<wsdl:input message="tns:getGreetingsList"></wsdl:input>
<wsdl:output message="tns:getGreetingsListResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsArrayList">
<wsdl:input message="tns:getGreetingsArrayList">
</wsdl:input>
<wsdl:output message="tns:getGreetingsArrayListResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsMap">
<wsdl:input message="tns:getGreetingsMap">
</wsdl:input>
<wsdl:output message="tns:getGreetingsMapResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsHashMap">
<wsdl:input message="tns:getGreetingsHashMap"></wsdl:input>
<wsdl:output message="tns:getGreetingsHashMapResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsVarArgs">
<wsdl:input message="tns:getGreetingsVarArgs">
</wsdl:input>
<wsdl:output message="tns:getGreetingsVarArgsResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloServiceBinding" type="tns:HelloService">
<soap11:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getGreetings">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsArray">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsList">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsArrayList">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsMap">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsHashMap">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getGreetingsVarArgs">
<soap11:operation />
<wsdl:input>
<soap11:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap11:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloServiceService">
<wsdl:port name="HelloServicePort"
binding="tns:HelloServiceBinding">
<soap11:address location="http://localhost:8085/hs-ep" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
When I use the above wsdl with wsimport, I am getting an error. The
following is the output in the command window:
D:\T\databinding> \JAXWS\jaxws-ri\bin\wsimport -keep -s hhll
hello-service.wsdl
parsing WSDL...
[WARNING] src-resolve.4.2: Error resolving component
'ns0:arrayList'. It was det
ected that 'ns0:arrayList' is in namespace 'http://util.java/', but
components f
rom this namespace are not referenceable from schema document
'file:/D:/T/databi
nding/hello-service.wsdl#types?schema3'. If this is the incorrect
namespace, per
haps the prefix of 'ns0:arrayList' needs to be changed. If this is
the correct n
amespace, then an appropriate 'import' tag should be added to
'file:/D:/T/databi
nding/hello-service.wsdl#types?schema3'.
line 127 of file:/D:/T/databinding/hello-service.wsdl#types?schema3
[ERROR] undefined simple or complex type 'ns0:arrayList'
line 127 of file:/D:/T/databinding/hello-service.wsdl
[ERROR] undefined simple or complex type 'ns0:arrayList'
line 135 of file:/D:/T/databinding/hello-service.wsdl
[ERROR] undefined simple or complex type 'ns0:hashMap'
line 159 of file:/D:/T/databinding/hello-service.wsdl
[ERROR] undefined simple or complex type 'ns0:hashMap'
line 167 of file:/D:/T/databinding/hello-service.wsdl
When I add the above wsdl document to my contribution and try to use
interface.wsdl in place of interface.java, I am getting the
following exception:
java.lang.NullPointerException
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.updateSchemaRefs(Axis2ServiceProvider.java:527)
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.addSchemas(Axis2ServiceProvider.java:519)
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.createWSDLAxisService(Axis2ServiceProvider.java:486)
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.createAxisService(Axis2ServiceProvider.java:377)
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.start(Axis2ServiceProvider.java:264)
at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceBindingProvider.start(Axis2ServiceBindingProvider.java:65)
at
org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl$3.run(CompositeActivatorImpl.java:618)
at java.security.AccessController.doPrivileged(Native Method)
at
org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl.start(CompositeActivatorImpl.java:616)
at
org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl.start(CompositeActivatorImpl.java:548)
at
org.apache.tuscany.sca.node.impl.NodeImpl.start(NodeImpl.java:613)
at
org.apache.tuscany.sca.itest.databindings.jaxb.topdown.DatabindingTestCase.setUp(DatabindingTestCase.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
at
org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
at
org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Can someone help me figure the problem? Thanks in advance.
++Vamsi