JAX-WS has XSD schema in different URL

11,859

Is this how it should be?

Separating the XSD from the WSDL is the default behaviour in JAX-WS, and you shouldn't need to worry too much about it. Up-to-date WS frameworks (including WCF) are generally able to handle that. Depending on the size of the XSD, importing it might make the WSDL more readable for a human. For a small web service it would certainly be easier to have an embedded schema, but it's also not too much of a problem to import it.

How can I configure JAX-WS to place all XSD definitions in one WSDL file?

I don't know of a direct way to make the runtime embed the schema in the WSDL, but there is a workaround through which you can achieve this:

  1. Publish your endpoint and save the WSDL and the XSD
  2. Manually copy the content of the XSD into the types section of the WSDL and replace the schema import there
  3. Save the merged WSDL file somewhere where your application can access it as a resource
  4. Have your web service load the merged WSDL. This will stop the dynamic generation however, you will have to manually update the WSDL each time you make changes to the interface

You can implement 4. by customizing the @WebService annotation. This might look somewhat like this:

@WebService( wsdlLocation = "MyWebService.wsdl")
public class MyWebService { .... }
Share:
11,859
Mawia
Author by

Mawia

Java Programmer

Updated on July 03, 2022

Comments

  • Mawia
    Mawia almost 2 years

    I made a small web service using JAX-WS. The WSDL file has TYPES element like this.

    <types>
      <xsd:schema>
      <xsd:import namespace="http://ws.poc.mawia/" schemaLocation="http://localhost:777/ws/hello?xsd=1"/>
      </xsd:schema>
    </types>
    

    The URL for web service is http://localhost:777/ws/hello?wsdl and XSD is http://localhost:777/ws/hello?xsd=1 . The XSD Schema file in different location has the data type definitions like this.

    ...
     ...
        <xs:complexType name="student">
         <xs:sequence>
         <xs:element name="name" type="xs:string" minOccurs="0"/>
         <xs:element name="rollNo" type="xs:int"/>
         </xs:sequence>
        </xs:complexType>
      ...
     ...
    

    Most of the WSDL files I have seen usually has the complete XSD definitions inside the WSDL file itself but JAX-WS is placing it in a different location.

    Is this how it should be? How can I configure JAX-WS to place all XSD definitions in one WSDL file?