Java 编写jax-ws-web服务并在不使用XSD的情况下生成WSDL

Java 编写jax-ws-web服务并在不使用XSD的情况下生成WSDL,java,web-services,tomcat,wsdl,jax-ws,Java,Web Services,Tomcat,Wsdl,Jax Ws,我在java上为tomcat应用服务器编写了一个简单的JAX-WS web服务 我有一个接口和一个实现类: 接口 实施 我的问题是,在我的wsdl文件中,响应类是在xsd文件中定义的。 这是我的wsdl文件中的片段 <types> <xsd:schema> <xsd:import namespace="http://ws.mari.ge/" schemaLocation="http://localhost:8080/MyServcie/MyW

我在java上为tomcat应用服务器编写了一个简单的JAX-WS web服务

我有一个接口和一个实现类:
接口


实施

我的问题是,在我的wsdl文件中,响应类是在xsd文件中定义的。
这是我的wsdl文件中的片段

<types>
<xsd:schema>
          <xsd:import namespace="http://ws.mari.ge/" schemaLocation="http://localhost:8080/MyServcie/MyWs?xsd=1">
</xsd:import>
</xsd:schema>
</types>

如何使web服务生成WSDL文件中的所有类型而不是单独的XSD文件?

我是否应该更改任何配置或向我的web服务添加一些注释?

如果JAX生成带有内联模式的WSDL是不可能的

顺便说一句:分离WSDL定义和XSD模式是一个很好的举措(您可能希望在不同的上下文中使用模式定义的对象结构,例如将数据存储到文件或类似的内容)


这就是说:如果您需要一个“一体式”WSDL(因为一些古老的客户机需要它),那么您总是可以让
jax-ws
最初生成WSDL,然后根据自己的内心内容编辑它。可以使用
@WebService
注释的
wsdlLocation
参数包含编辑的WSDL。

您可以让JAX-WS使用

-inlineSchemas
命令行开关。[1]

如果您在项目中使用Maven,您可以将JAX-WS Maven插件配置为对执行配置中的inlineSchemas配置元素执行相同的操作,如下所示:[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>

org.jvnet.jax-ws-commons


[2]

实际上,在运行时WSDL生成器中使用
inlineSchema
是不可能的。我调试了WSDL生成,并在
EndpointFactory
中找到了这一行,其中
inlineSchemas
功能(实际上存在于
wsgen
工具中)被设置为
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);
        // [...]
    }
/**
*如有必要,为端点生成WSDL和XML架构
*它仅为SOAP1.1和XSOAP1.2绑定生成WSDL
*/
私有静态SDDocumentImpl generateWSDL(WSBinding绑定、AbstractSeimodeImpl seiModel、集合文档、,
容器,类(类型){
// [...]
WSDLGenInfo WSDLGenInfo=新的WSDLGenInfo();
// [...]
wsdlGenInfo.setInlineSchemas(false);
// [...]
seiModel.getDatabinding().generateWSDL(wsdlGenInfo);
// [...]
}

JAX-WS要改变这一点还有一个开放的问题(但我想JAX-WS中的改变已经没有多大希望了)。

指示JAX-WS内联模式确实是可能的。有关如何实现这一点的说明,请参见我上面的回答。@Kallja:我假设OP是指应用程序服务器生成的WSDL(因为有一个
schemaLocation=”http://localhost:8080/MyServcie/MyWs?xsd=1"
在WSDL片段中。我不知道有什么方法可以说服应用服务器生成一体式WSDL…但你的观点很好。我需要记住你使用的
wsgen
参数。:-)谢谢。你是个救命恩人。
<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>
    /**
     * 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);
        // [...]
    }