Write jax-ws web service and generate WSDL without XSD

后端 未结 3 1089
我在风中等你
我在风中等你 2021-02-14 02:57

I wrote a simple JAX-WS web service for tomcat application server on java.

I have one interface and on implementation class:
interface

@We         


        
相关标签:
3条回答
  • 2021-02-14 03:40

    You can have JAX-WS insert the generated schema into your WSDL file by using the

    -inlineSchemas
    

    command line switch. [1]

    If you're using Maven in your project you can configure the JAX-WS maven plugin to do the same with the inlineSchemas configuration element in your execution configuration as follows: [2]

    <plugin>
      <groupId>org.jvnet.jax-ws-commons</groupId>
      <artifactId>jaxws-maven-plugin</artifactId>
      <version>2.2</version>
      <executions>
        <execution>
          <id>SomeId</id>
          <goals>
            <goal>wsgen</goal>
          </goals>
          <phase>prepare-package</phase>
          <configuration>
            <sei>some.class.Name</sei>
            <genWsdl>true</genWsdl>
            <keep>true</keep>
            <resourceDestDir>some/target/dir</resourceDestDir>
            <inlineSchemas>true</inlineSchemas>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    No changes to your Java class are necessary.

    [1] http://jax-ws.java.net/nonav/2.2.1/docs/wsgen.html

    [2] http://jax-ws-commons.java.net/jaxws-maven-plugin/wsgen-mojo.html

    0 讨论(0)
  • 2021-02-14 03:41

    AFAIK it ist not possible to have JAX generate a WSDL with schemas inline.

    BTW: Separating the WSDL definition and the XSD schema is a good move (you might want to use the object structure defined by the schema in a different context e.g. storing data to files or something like that).

    That said: If you need an "all in one" WSDL (because some ancient client requires it) you can always have jax-ws generate the WSDL initially and then edit it to your heart's content. The edited WSDL can be included using the wsdlLocation parameter of the @WebService annotation.

    0 讨论(0)
  • 2021-02-14 03:51

    It is actually not possible to use inlineSchemas with the runtime WSDL generator. I debugged the WSDL generation and found this line in the EndpointFactory, where the inlineSchemas feature (which actually is present in the wsgen tool) is just set to false:

        /**
         * Generates the WSDL and XML Schema for the endpoint if necessary
         * It generates WSDL only for SOAP1.1, and for XSOAP1.2 bindings
         */
        private static SDDocumentImpl generateWSDL(WSBinding binding, AbstractSEIModelImpl seiModel, Collection<SDDocumentImpl> docs,
                                                   Container container, Class implType) {
            // [...]
            WSDLGenInfo wsdlGenInfo = new WSDLGenInfo(); 
            // [...]
            wsdlGenInfo.setInlineSchemas(false);
            // [...]
            seiModel.getDatabinding().generateWSDL(wsdlGenInfo);
            // [...]
        }
    

    https://github.com/eclipse-ee4j/metro-jax-ws/blob/f37dae6bdfd03bafdad63ed05b27dbfc3c38af1b/jaxws-ri/rt/src/main/java/com/sun/xml/ws/server/EndpointFactory.java#L658

    There is also an open issue for JAX-WS to change this (but I guess there is not much hope for changes in JAX-WS anymore). https://github.com/eclipse-ee4j/metro-jax-ws/issues/49

    0 讨论(0)
提交回复
热议问题