为 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 API for XML-Based Web Services (JAX-WS) Web Service 应用程序,必须先开发用于显式或隐式描述服务端点接口 (SEI) 的 SEI 实现。

关于此任务

使用自底向上方法来开发 JAX-WS Web Service 时,请对现有的服务端点实现使用 wsgen 命令行工具。wsgen 工具将编译后的服务端点实现类处理为输入并生成下列可移植工件:
  • 对消息内容进行编组和数据编出所需要的 Java XML 绑定体系结构 (JAXB) 类。
  • Web 服务描述语言 (WSDL) 文件(如果指定了可选的 -wsdl 自变量)。
支持的配置 支持的配置: z/OS® 平台不支持 wsimportwsgenschemagenxjc 命令行工具。随在 z/OS 平台上运行的 WebSphere® Application Server 一起提供的组装工具提供了此功能。请针对 JAX-WS 应用程序查看这些命令行工具,以更多地了解这些工具。sptcfg
最佳实践 最佳实践: WebSphere Application Server 提供 Java API for XML-Based Web Services (JAX-WS) 和 Java XML 绑定体系结构 (JAXB) 工具。wsimportwsgenschemagenxjc 命令行工具位于 WebSphere Application Server(传统)app_server_root\bin\ 目录中。xjcschemagen 命令位于 Liberty 概要文件中的 app_server_root\jaxb\bin\ 目录中。在某些情况下,由 WebSphere Application Server 提供的工具以及 JDK 两者所生成的工件支持相同级别的规范。总之,JDK 工具生成的工件可在其他顺应的运行时环境之间移植。然则,最好是使用本产品附带提供的工具来在 WebSphere Application Server 环境内实现无缝集成并利用可能仅在 WebSphere Application Server 中受支持的功能部件。要利用 JAX-WS 和 JAXB V2.2 工具,请使用应用程序服务器附带提供的工具,这些工具位于 app_server_root\bin\ 目录。bprac

从 JavaBeans 开始,通过自底向上方法开发 JAX-WS Web Service 时,不必开发 WSDL 文件。注释的使用提供了配置服务端点或客户机所必需的所有 WSDL 信息。应用程序服务器支持符合 Web Services-Interoperability (WS-I) 基本概要文件 1.1 规范的 WSDL 1.1 文档,这些文档是 Document/Literal 样式文档或 RPC/Literal 样式文档。另外,还支持包含对值 LITERALUSE 属性进行声明的绑定的 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。

过程

  1. 查找服务端点实现类文件。
  2. 运行 wsgen 命令以生成可移植工件。 wsgen 工具位于 app_server_root/bin/ 目录。
    [Windows]
    app_server_root\bin\wsgen.bat [options] service_implementation_class
    [AIX][HP-UX][Linux][Solaris]
    app_server_root/bin/ wsgen.sh [options] service_implementation_class
    [IBM i]
    app_server_root/bin/ wsgen [options] service_implementation_class
    (可选)将以下选项与 wsgen 命令一起使用:
    • 使用 -verbose 选项来查看所生成文件的列表以及其他的参考消息。
    • 使用 -keep 选项来保留生成的 Java 文件。
    • 使用 -wsdl 选项来生成 WSDL 文件。如果您要开发将使用 HTTP 传输方法调用的服务实现 Bean,那么在此步骤期间通过 wsgen 命令行工具生成的 WSDL 文件是可选的。但是,如果您要开发将使用 SOAP over JMS 传输调用的服务实现 Bean,那么在此步骤期间由 wsgen 工具生成的 WSDL 文件在后续开发 JAX-WS 应用程序的步骤中是必需的,所以该文件不是可选的。

    阅读 wsgen 以了解有关该命令的更多信息以及您可以指定的其他选项。

结果

您具有创建 JAX-WS Web Service 所需的 Java 工件。

避免故障 避免故障: 当多个 XMLType 注释在不同 Java 包中定义了同一个 @XMLType 名称时,wsgen 命令无法在这些注释之间区分 XML 名称空间。如果出现了这种情况,那么将产生以下错误:
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 虚拟机定制属性的相关文档。

示例

以下示例演示如何使用 wsgen 命令来处理服务端点实现类以生成 JAX-WS 工件。本示例 EchoService 服务实现类使用显式 JavaBeans 服务端点。
  1. 将样本 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);
    
    }
  2. app_server_root\bin\ 目录运行 wsgen 命令。-cp 选项指定服务实现类文件的位置。-s 选项指定生成的源文件的目录。-d 选项指定生成的输出文件的目录。使用 -s-d 选项时,必须首先对生成的输出文件创建目录。
    [Windows]
    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\
    [Linux][AIX][HP-UX][Solaris]运行 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/
使用 wsgen 命令生成 Java 工件后,将生成下列文件:
/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 应用程序的实现。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_devjaxwsartifactsbean
文件名:twbs_devjaxwsartifactsbean.html