I'm testing a fix for this now.   Basically, when jaxb generates the schemas, 
it more or less creates 'temporary' schemaLocations in the schemas. (like 
schema1.xsd, schema2.xsd, etc...)    Since we inline everything in the wsdl, 
we strip them out.   However, we're stripping out all the locations, not just 
the temporary ones.   I've fixed that.

HOWEVER (and this is important), we have to process the generated schema as we 
don't know if we need to add wrapper elements, we need to get the "types" 
out,etc...   Thus, if "http://localhost:8080/jaxws-example-ws/xsd/example.xsd"; 
is not resolvable when you run "mvn install", it will fail.     I was able to 
get around that by adding a catalog in:

src/main/resources/META-INF/jax-ws-catalog.xml

that contains:
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system">
    <rewriteURI 
    uriStartString="http://localhost:8080/jaxws-example-ws/xsd/example.xsd"; 
rewritePrefix="file:/tmp/t2/jaxws-example-
ws/src/main/webapp/xsd/example.xsd"/>
</catalog>

to re-write the location to a local file on disk during processing. 

In anycase, tonights snapshots should fix this.


Dan


On Monday, January 16, 2012 12:34:21 PM Mordecus wrote:
> Hi Daniel, I've put together a little test case.
> 
> If you download the zip archive at this link:
> 
> http://dl.dropbox.com/u/24296192/JAXWSExample.zip
> 
> You will find two maven projects inside. The first one, jaxws-example-model,
> contains a simple Java POJO called "Message". The project contains the
> necessary JAXWS annotations to control how the schema for this object gets
> generated; and it specifies the location of an external schema file; like
> so:
> 
> @XmlSchema(namespace="urn:ws.example.com:model",
> location="http://localhost:8080/jaxws-example-ws/xsd/example.xsd";)
> package com.example.model;
> import javax.xml.bind.annotation.XmlSchema;
> 
> 
> Note that the POM file of the project has the JAXB plugin so that the schema
> file can be re-generated if required (although that would require removing
> the location attribute from the @XmlSchema annotation again; as JAXB will
> ignore any packages that have that).
> 
> The second project, jaxws-example-ws, is the actual webservice. It has a
> dependency on jaxws-example-data; so you will have to run a mvn install on
> that project first in order for compilation to work. The webservice is
> rigged up in the src/main/resources/spring/appContext.xml file; like so:
> 
> <jaxws:endpoint
>         id="exampleWebService"
>         implementor="#exampleService"
>         implementorClass="com.example.ws.ExampleWebServiceImpl"
>         address="/ExampleService"
> 
> 
> I'm also using the cxf-java2ws-plugin in the POM file to generate a static
> WSDL file at /src/main/wsdl/ExampleWebService.wsdl. This WSDL is identical
> to the one generated on the fly by CXF if you start the application; so in
> both cases the behavior is similar.
> 
> If you look at the WSDL; you'll see that the urn:ws.example.com:model schema
> is imported; but no schemaLocation is specified; which results in a
> malformed WSDL.
> 
> 
> 
> I guess I should have also explained what I'm actually trying to do. Our
> company is implementing a full SOA approach; including the use of ESBs and
> WS-BPEL. As we're offering a full fledged API to our customers; we're
> finding that a lot of our webservices re-use the same underlying domain
> objects. We don't want each webservice have it's own embedded schema
> definitions for these domain objects; because, among other things, it causes
> problems when using BPEL. So the idea was to have a foundation of schema's
> describing domain objects (users, accounts, etc, etc) and then having the
> various webservice wsdls reference those.
> 
> With a contract-first approach, this is of course perfectly possible; and
> that's in fact what we're doing right now. But given number of webservice
> operations we're implementing, WSDL first is turning out to be quite
> cumbersome and time-consuming. A Java-first approach would allow us to roll
> out webservices quicker; while retaining full control over the form of the
> generated WSDL by using the JAXWS annotations.
> 
> It's still a less than ideal situation; as you can see - we need to remove
> the location attribute from the XMLSchema annotation to have JAXB generate
> the external schema; then add it back in to avoid having the
> cxf-java2ws-plugin generate the schema when the WSDL is generated; but it's
> workable.
> 
> I suppose the ultimate solution would be something similar to what's
> possible with the wsdl2java plugin and the -nexclude argument that can be
> added into the WSDLOption of the plugin... if we could somehow tell the
> cxf-java2ws-plugin that when it encounters the schema urn:com.example.model,
> it should NOT generate a schema in the WSDL but instead import an external
> schema at http://localhost/jaxws-example-ws/xsd/example.xsd; that would
> really be the perfect solution; i.e something like:
> 
> <plugin>
>                   <groupId>org.apache.cxf</groupId>
>                   <artifactId>cxf-java2ws-plugin</artifactId>
>                   <version>${cxf.version}</version>
>                   <dependencies>
>                       <dependency>
>                           <groupId>org.apache.cxf</groupId>
>                           <artifactId>cxf-rt-frontend-jaxws</artifactId>
>                           <version>${cxf.version}</version>
>                       </dependency>
>                       <dependency>
>                           <groupId>org.apache.cxf</groupId>
>                           <artifactId>cxf-rt-frontend-simple</artifactId>
>                           <version>${cxf.version}</version>
>                       </dependency>
>                   </dependencies>
> 
>                   <executions>
>                       <execution>
>                           <id>process-classes</id>
>                           <phase>process-classes</phase>
>                           <configuration>
>                               
<className>com.example.ws.ExampleWebService</className>
>                               <genWsdl>true</genWsdl>
>                               <verbose>true</verbose>
> 
> <outputFile>${basedir}/src/main/wsdl/ExampleWebService.wsdl</outputFile>
>                                 *<extraargs>
>                                       <extraarg>-nexclude</extraarg>
> 
> <extraarg>urn:ws.example.com:model=http://localhost/jaxws-example-ws/xsd/exa
> mple.xsd</extraarg> </extraargs>*
>                           </configuration>
>                           <goals>
>                               <goal>java2ws</goal>
>                           </goals>
>                       </execution>
>                   </executions>
>               </plugin>
> 
> But I don't know how hard that is to implement....
> 
> --
> View this message in context:
> http://cxf.547215.n5.nabble.com/CXF-java2wsdl-plugin-not-importing-external
> -schema-defined-in-XmlSchema-annotation-tp5135016p5149809.html Sent from the
> cxf-user mailing list archive at Nabble.com.
-- 
Daniel Kulp
[email protected] - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com

Reply via email to