当前位置: 首页 > 知识库问答 >
问题:

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

宋琛
2023-03-14

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

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

@WebService(name = "myWs")
@SOAPBinding(style = Style.RPC)
public interface IMyWs {
    @WebMethod(operationName = "getUser")
    Response getUser(@WebParam(name = "phone", mode = Mode.IN) String phone);

}


实施

@WebService(endpointInterface = "ge.mari.IMyWs")
public class MyWs implements IMyWs {
    @Override
    public Response getUser(String phone) {
               // SOME CODE
        return response;
    }
}

我的问题是,在我的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服务添加一些注释?

共有3个答案

钮长恨
2023-03-14

实际上,在运行时WSDL生成器中不可能使用inlineSchemas。我调试了WSDL生成,并在Endpoint Factory中发现了这一行,其中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);
        // [...]
    }

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

JAX-WS要改变这一点还有一个开放的问题(但我想JAX-WS中的改变已经没有多大希望了)。https://github.com/eclipse-ee4j/metro-jax-ws/issues/49

谢泉
2023-03-14

AFAIK不可能让JAX生成一个带有内联模式的WSDL。

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

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

韩耘豪
2023-03-14

您可以让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>

不需要对Java类进行任何更改。

[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

 类似资料:
  • 我有 Windows Server 2012 R2上的WebSphere Liberty 17.0.0.1“base_ilan”x86_64 Windows 10 x86_64上的Eclipse Neon.3(同一LAN上的独立服务器) Oracle Java JDK 1.8.0_121running Liberty 运行Eclipse的IBM JDK 8(来自Eclipse包)(需要它来支持Wi

  • 我有一个JAX-WS注释的Web服务,当我将其部署到WildFly 8.1.0 Final中时,我有如下内容: 当我想要这样的东西时: 因此,基本上,我希望WildFly/JAX-WS将一些类型放在一个单独的XSD模式文件中,而不是仅仅在WSDL文件中显示它们。 我可以通过一些注释或一些配置文件来执行此操作吗?

  • 你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W

  • 我需要调用WildFly 8上可用的JAX-WS Web服务。我从一个简单的例子开始。这是我的网络服务: WSDL 可在以下网址获得: http://localhost:8080/DemoWS/HelloWorld?wsdl 看看Tomcat-CXF的例子,我编写了以下路由: 通过在 Camel 上下文中运行上述代码,将返回以下错误: serviceClass=com.sample。HelloWo

  • 如前一个StackOverflow问题所述,我正在学习如何使用JAX-WS(用于XML Web服务的Java API)。我在以前的可执行Java程序中使用过Log4j2,我想用它来记录web服务请求。在本JAX-WS教程中,如何将Log4j2添加到基本代码中?

  • 问题内容: 去年,我通过此链接为Web服务制作了JAX- WS客户端 该Web 服务使用STS服务获取SAML令牌并使用它访问主要Web服务。我使用apache cxf的wsdl2java为该Web服务生成JAX-WS客户端。一切都很好。 最近,他们已更新其STS服务端点。这个新的STS服务端点。其中具有不同的签名和摘要算法。它在请求正文中有一些额外的元素。 我试图修改当前代码,以使其支持新的ST