You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Pavol Mederly <pa...@gmail.com> on 2014/10/03 11:46:21 UTC

Wrong schemaLocation if jax-ws-catalog is used

Hello,

recently I've come across this problem:

We use a WSDL-first approach with endpoints defined so that our 
hand-written WSDL is served to the clients when asking via "?wsdl" URL 
(not the generated one). Moreover, we use jax-ws-catalog to map 
"logical" URLs like 
"http://midpoint.evolveum.com/xml/ns/public/common/common-3" to concrete 
ones, pointing to appropriate WSDL/XSD files in our directory structure.

However, sometimes the WSDL given out to clients via "?wsdl" URL is 
incorrect.

Specifically, having entries in jax-ws-catalog like these

<public  publicId="http://test.com/main/schema"  uri="../main/schema.xsd"  />
<system systemId="http://test.com/main/schema"  uri="../main/schema.xsd"  />

<public  publicId="http://test.com/auxiliary/schema"  uri="../auxiliary/auxiliary.xsd"  />
<system systemId="http://test.com/auxiliary/schema"  uri="../auxiliary/auxiliary.xsd"  />

And having XSD imports in your types section of WSDL like these:

<xs:schema targetNamespace="http://test.com/main/customer-service"  ...>
     <!--this  fails -->
     <xsd:import  namespace="http://test.com/main/schema"  schemaLocation="http://test.com/main/schema"/>
     <!--this  works -->
     <xsd:import  namespace="http://test.com/auxiliary/schema"  schemaLocation="http://test.com/auxiliary/schema"/>
</xs:schema>

The resulting WSDL is like this (showing only the relevant part):

<xs:schema targetNamespace="http://test.com/main/customer-service"  ...>
     <!--this  fails -->
     <xsd:import  namespace="http://test.com/main/schema"  schemaLocation="*http://test.com/main/schema*"/>
     <!--this  works -->
     <xsd:import  namespace="http://test.com/auxiliary/schema"  schemaLocation="*http://localhost:9090/CustomerServicePort?xsd=http://test.com/auxiliary/schema*"/
</xs:schema>

(note the wrong schemaLocation attribute in the first import; the second 
one is correct)

The problem occurs when the URI of the resource being imported is the 
same as (except for its last segment) the URI of the WSDL itself.

Is there any fix or workaround known? I've been able to cope with that 
only by disabling "URL optimization" code in 
WSDLGetUtils.findSchemaLocation (see here 
<https://github.com/Evolveum/cxf/commit/db271307765939ee40b7f7f0b25ec6d7ae02052a#diff-91>) 
but I'm unsure of possible side effects of this change.

I've opened CXF-6034 <https://issues.apache.org/jira/browse/CXF-6034>, 
there is also a demonstration code attached.

Thank you in advance.
Pavol