为 JAX-WS 应用程序生成 Java 工件
使用 Java™ API for XML-Based Web Services (JAX-WS) 工具来生成从 JavaBeans 或企业 Bean 组件开始时 JAX-WS Web Service 应用程序所必需的 JAX-WS 和 Java XML 绑定体系结构 (JAXB) Java 工件。
开始之前
关于此任务
- 对消息内容进行编组和数据编出所需要的 Java XML 绑定体系结构 (JAXB) 类。
- Web 服务描述语言 (WSDL) 文件(如果指定了可选的 -wsdl 自变量)。


从 JavaBeans 开始,通过自底向上方法开发 JAX-WS Web Service 时,不必开发 WSDL 文件。注释的使用提供了配置服务端点或客户机所必需的所有 WSDL 信息。应用程序服务器支持符合 Web Services-Interoperability (WS-I) 基本概要文件 1.1 规范的 WSDL 1.1 文档,这些文档是 Document/Literal 样式文档或 RPC/Literal 样式文档。另外,还支持包含对值 LITERAL 的 USE 属性进行声明的绑定的 WSDL 文档,但不支持值 ENCODED。对于实现 Document/Literal 合并模式的 WSDL 文档,在 XML 模式中声明了一个根元素并将其用作消息流的操作包装程序。请求和响应各自具有单独的包装程序元素定义。
要确保 wsgen 命令不会漏掉服务端点实现 Bean 上的继承方法,您必须将 @WebService 注释添加至期望的超类,也可以使用对超类方法的调用来覆盖实现类中的继承方法。
虽然开发 JAX-WS 服务实现 Bean 时,WSDL 文件通常是可选的,但使用 SOAP over JMS 传输显示 JAX-WS 端点并且您要发布 WSDL 文件时,该文件是必需的。如果要开发使用 SOAP over JMS 传输调用的 Enterprise JavaBeans 服务实现 Bean,并且要发布 WSDL 以便发布的 WSDL 文件包含完全解析的 JMS 端点 URL,那么通过指定 -wsdl 自变量使 wsgen 工具生成 WSDL 文件。在该情况中,必须将 WSDL 文件与 Web Service 应用程序一起打包。
除了从命令行使用这些工具之外,还可以从 Ant 构建环境中调用这些 JAX-WS 工具。从 Ant 构建环境中使用 com.sun.tools.ws.ant.WsGen Ant 任务可以调用 wsgen 工具。为了正常运行,此 Ant 任务需要您使用 ws_ant 脚本来调用 Ant。
过程
结果
您具有创建 JAX-WS Web Service 所需的 Java 工件。

Error: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
此错误指示您具有同名的类或 @XMLType.name 值,但它们存在于不同的 Java 包中。要防止此错误,请将 @XML.Type.namespace 类添加至现有的 @XMLType 注释以区分 XML 类型。gotcha使用 JAX-WS 应用程序时,wsgen 命令行工具可能无法找到共享的类文件。可以使用 com.ibm.websphere.webservices.WSDL_Generation_Extra_ClassPath 定制属性来指定这些类文件的位置。有关更多信息,请参阅 Java 虚拟机定制属性的相关文档。
示例
- 将样本 EchoServicePortTypeImpl 服务实现类文件及关联的 EchoServicePortType 服务接口类文件复制到目录。此目录必须包含与类文件的 com.ibm.was.wssample.echo 包名相对应的目录树结构。
/* This is a sample EchoServicePortTypeImpl.java file. */ package com.ibm.was.wssample.echo; @javax.jws.WebService(serviceName = "EchoService", endpointInterface = "com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/", portName="EchoServicePort") public class EchoServicePortTypeImpl implements EchoServicePortType { public EchoServicePortTypeImpl() { } public String invoke(String obj) { System.out.println(">> JAXB Provider Service: Request received.\n"); String str = "Failed"; if (obj != null) { try { str = obj; } catch (Exception e) { e.printStackTrace(); } } return str; } }
/* This is a sample EchoServicePortType.java file. */ package com.ibm.was.wssample.echo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; @WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/", wsdlLocation="WEB-INF/wsdl/Echo.wsdl") public interface EchoServicePortType { /** * * @param arg0 * @return * returns java.lang.String */ @WebMethod @WebResult(name = "response", targetNamespace = "http://com/ibm/was/wssample/echo/") @RequestWrapper(localName = "invoke", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.Invoke") @ResponseWrapper(localName = "echoStringResponse", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.EchoStringResponse") public String invoke( @WebParam(name = "arg0", targetNamespace = "http://com/ibm/was/wssample/echo/") String arg0); }
- 从 app_server_root\bin\ 目录运行 wsgen 命令。-cp 选项指定服务实现类文件的位置。-s 选项指定生成的源文件的目录。-d 选项指定生成的输出文件的目录。使用 -s 或 -d 选项时,必须首先对生成的输出文件创建目录。
app_server_root\bin\wsgen.bat -wsdl -s c:\generated_source\ -cp c:\my_application\classes\ com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:\generated_artifacts\
运行 wsgen 命令;例如:
app_server_root/bin/wsgen.sh -wsdl -s c:/generated_source/ -cp c:/my_application/classes/ com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:/generated_artifacts/
/generated_source/com/ibm/was/wssample/echo/EchoStringResponse.java
/generated_source/com/ibm/was/wssample/echo/Invoke.java
/generated_artifacts/EchoService.wsdl
/generated_artifacts/EchoService_schema1.xsd
/generated_artifacts/com/ibm/was/wssample/echo/EchoStringResponse.class
/generated_artifacts/com/ibm/was/wssample/echo/Invoke.class
EchoStringResponse.java 和 Invoke.java 文件是生成的 Java 类文件。所生成 Java 文件的编译版本是 EchoStringResponse.class 和 Invoke.class 文件。由于指定了 -wsdl 选项,将生成 EchoService.wsdl 和 EchoService_schema1.xsd 文件。
下一步做什么
完成 JAX-WS Web Service 应用程序的实现。