`

jdk的wsgen.exe和cxf的wsimport.bat建立简单JAX-WS客户端服务端实践

 
阅读更多

概要:

实现Java SOAP WebService目前有多种API/框架实现(JAX-WS,CXF,Axis2,XFire),记录一下仅通过JAX-WS库实现SOAP WebService 服务/客户端的过程;

如果使用IDE插件这个过程更简单,下面记录不通过IDE实现客户端及部署开放服务端接口。

 

环境:

JDK1.7,

Tomcat7,

jaxws-ri-2.2.8\jaxws-ri\lib\*,

Apache CXF wsdl2java.bat(cxf3.1.6)。

 

基本流程:

1,服务端:建立Dynamic Java Web Project,加入必要的类库(jaxws-ri-2.2.8\jaxws-ri\lib\*)

2,服务端:建立WebService服务类和服务方法

3,服务端:配置web.xml WSServlet和WSServletContextListener

4,服务端:配置sun-jaxws.xml的endpoint

5,服务端:部署WebService的Project,运行

6,客户端:使用cxf的wsimport.bat根据wsdl(URL)生成客户端调用代理代码。

7,客户端:测试。

 

详细流程:

1,略

2,步骤代码:

 

package wsgen.test1;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(targetNamespace = "http://merrick.wsgen.test/", serviceName = "WSGen1Service", portName = "WSGen1Port")
public class WSGen1 {
	
	@WebMethod
	public String method1(String par1){
		
		return par1 + ",hello!";
	}

}


3,配置代码:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

 <servlet>
  	<description>
  		JAX-WS endpoint 
  	</description>
	<servlet-name>WSIMPORTtest</servlet-name>
  	<servlet-class>
  		com.sun.xml.ws.transport.http.servlet.WSServlet
  	</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <listener>
  	<listener-class>
  		com.sun.xml.ws.transport.http.servlet.WSServletContextListener
    </listener-class>
  </listener>
</web-app>

4,配置Endpoint

<?xml version = "1.0"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint name="WSGen1Port" implementation="wsgen.test1.WSGen1"
		url-pattern="/WSGen1Port">
	</endpoint>
</endpoints>


5,略

6,生成步骤,因为直接使用jdk的wsimport.exe产生了问题,原因及过程引用如下,改用cxf的wsimport.bat:

JDK提供了一个wsimport.exe的命令,主要是用于将WebService生成客户端代码,然后好调用WebService。
  wsimport 是根据JDK1.6.0_21及以上的生成本地代码的,它只能解析服务器端的SOAP协议为1.1,不能解析SOAP1.2的协议。如果解析SOAP1.2 将会解析不完全。
  用法:前提是已经将JDK配置为了path环境变量 C:\Documents and Settings\Administrator>wsimport -s F:\ -p com.client.jdk.wsimport http://localhost:1111/hello?wsdl
  -s 后面指定生成文件的路径,-p 自定义类包 http://localhost:1111/hello?wsdl 是wsdl的路径。

  CXF也提供了根据WSDL生成客户端代码的命令wsdl2java(bat)。它是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。
它可以支持SOAP1.1 和SOAP1.2的协议。前提是你已经下载了Apache CXF 并且将wsdl2java.exe配置为了path环境变量。
  用法:C:\Documents and Settings\Administrator>wsdl2java -d F:\ -p com.client.cxf http://localhost:1111/hello?wsdl
  -d 后面指定生成文件的路径,-p 自定义类包 http://localhost:1111/hello?wsdl 是wsdl的路径。


-------------------------采用jdk1.7的wsimport.exe的错误日志,如下:
D:\>wsimport -keep -p a.b.c http://localhost:8080/wsgenwsimporttest1/WSGen1Port?wsdl
parsing WSDL...


[ERROR] Server returned HTTP response code: 403 for URL: http://localhost:8080/wsgenwsimporttest1/WS
Gen1Port?wsdl

Failed to read the WSDL document: http://localhost:8080/wsgenwsimporttest1/WSGen1Port?wsdl, because
1) could not find the document; /2) the document could not be read; 3) the root element of the docum
ent is not <wsdl:definitions>.


[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):

At least one WSDL with at least one service definition needs to be provided.


Failed to parse the WSDL.

------------------------------------采用cxf的wsdl2java.bat正确日志,如下:
D:\SDK_java\apache-cxf-3.1.6\bin>wsdl2java -d e:\wsimporttest1 -p a.b.c http://localhost:8080/wsgenwsimporttest1/WSGen1Port?wsdl

D:\SDK_java\apache-cxf-3.1.6\bin>

------------------------说明
wsimport,用于根据jax-ws标准的wsdl文件生成客户端调用基础类及客户端jaxb
-d 生成客户端执行类的class文件的存放目录
-s 生成客户端执行类的源文件的存放目录
-p 定义生成类的包名

 

-------------------生成的客户端代码:

package a.b.c中代码包括

Client1.java
Method1.java
Method1Response.java
ObjectFactory.java
package-info.java
WSGen1.java
WSGen1Service.java

 

7,调用,测试

根据Service Port调用接口方法:

 

public class Client1 {

	public static void main(String[] args) {

		URL u;
		try {
			u = new URL("http://localhost:8080/wsgenwsimporttest1/WSGen1Port?wsdl");		
			
			WSGen1Service c = new WSGen1Service(u);
			
			String r = c.getWSGen1Port().method1("merrick");			
			
			System.out.println(r);			
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		

	}

}



 

后记:

可以使用wsgen.exe生成wsdl文件,再使用该文件生成客户端。

D:\>wsgen -verbose -keep -cp D:\workspace_ElipseJEE_mars2\prj201601\bin wsgen.test1.WSGen1 -r E:\wsgentest1 -s E:\wsgentest1\src -d E:\wsgentest1\bin -wsdl

--------------------------------------说明
wsgen用于根据jax-ws的初始服务接口类(@WebService指定)生成对应用于部署WebService服务的WSDL文件及其他jaxb文件(xml bean)
-cp 定义classpath[指定java类编译后的.class文件所在的主包路径]
-r 生成 bean的wsdl文件的存放目录
-s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
-d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)
-verbose 编译信息
-wsdl 生成wsdl文件

 

 

分享到:
评论

相关推荐

    jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api

    CXF框架对JAX-WS提供了全面的支持,允许开发者轻松地创建SOAP服务和客户端。 **JAXWS-API.jar** 文件是JAX-WS API的实现,包含了处理Web服务所需的接口和类。这个文件可能包含在压缩包中,是为了确保在不兼容的环境...

    jax-ws发布webservice

    Java API for XML Web Services(JAX-WS)是Java平台上的一个标准,用于构建和部署Web服务。...在"jax-ws-server"和"jax-ws-client"这两个目录中,你可以找到完整的示例代码,帮助你理解和实践JAX-WS的使用。

    基于JDK自带的Web服务JAX-WS实现WebService的简单示例

    Java 基于第三方插件实现WebService实在麻烦,尤其是要添加几十M的Jar包...还好,自从JDK 1.6开始,Java自身已经支持WebSeervice的开发即JAX-WS,附件是一个简单的示例,供入门参考。注意,JDK环境要求1.6及以上版本。

    Web Service学习小结——基于JDK自带JAX-WS实现的web service

    - 此压缩文件可能包含了一个简单的JAX-WS Web服务示例,包括SEI接口、实现类、WSDL文件,以及可能的客户端测试代码。 总的来说,JAX-WS为Java开发者提供了一种方便的方式来创建、部署和使用Web服务。通过理解这些...

    jax-ws用户指南 pdf版

    通过上述内容可以看出,《jax-ws用户指南 pdf版》是一份详尽的参考资料,旨在帮助开发者充分了解和掌握 JAX-WS 2.2 的各项功能,以便能够高效地构建和部署 Web 服务。无论是初学者还是有经验的开发者都能从中获益匪...

    JAX-WS Web service

    **JAX-WS Web服务开发...通过以上步骤,开发者可以快速地创建、部署和测试JAX-WS Web服务,并在多种类型的客户端应用程序中使用。这个过程强调了JAX-WS如何通过简化开发流程和增强可移植性来提升Web服务开发的效率。

    JAX-WS的lib、src和docs

    在%JDK_HOME%/bin下有两个命令wsgen和wsimport,就是用到APT和Compiler API来处理碰到的Annotations,wsgen可以为Web Services Provider产生并编译必要的帮助类和相关支持文件,wsimport以WSDL作为输入为Web Service ...

    JAX-WS使用教程

    此外,JAX-WS还提供了几个常用的命令,比如wsgen和wsimport。wsgen是一个Java SE 6内置工具,用来生成Web服务类以及相关的部署描述符。wsimport是一个Java SE 6内置工具,用来生成客户端的存根和部署描述符,它们都...

    使用JAX-WS(JWS)发布WebService

    使用JAX-WS(JWS)发布WebService 使用myeclipse开发java的webservice的两种方式 方式一: (此方式只能作为调试,有以下bug:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在...

    MyEclipse中jax-ws开发教程

    在MyEclipse中使用JAX-WS开发Web服务是一个简单而高效的过程,下面将详细介绍这个过程中的关键步骤和涉及的技术点。 首先,JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和消费Web服务...

    java WebService Jax-WS创建

    【Java WebService Jax-WS 创建】是Java中创建Web服务的一种常见方式,主要用于构建基于SOAP(Simple Object Access Protocol)的Web服务。JAX-WS(Java API for XML Web Services)是Java EE 5及更高版本中提供的...

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    WebService开发服务端的两种方式:jdk、cxf

    本文将详细介绍使用JDK和CXF两种方式来开发WebService服务端。 一、JDK原生实现WebService(JAX-WS) 1. **JAX-WS概述**:Java API for XML Web Services (JAX-WS) 是Java平台上用于构建Web服务和客户端的API。它...

    webservicedemo+jax-ws

    5. **发布(Deploying)**:使用JAX-WS的工具,如`wsimport`或`@WebService`注解,将服务接口和实现部署到服务器上,使其可供网络访问。 6. **客户端调用(Client Invocation)**:JAX-WS也提供了生成客户端代理类...

    最新版windows jdk-11.0.20-windows-x64-bin.exe

    最新版windows jdk-11.0.20_windows-x64_bin.exe最新版windows jdk-11.0.20_windows-x64_bin.exe最新版windows jdk-11.0.20_windows-x64_bin.exe

    JAX-WS开发部署WebService

    【JAX-WS开发部署WebService】是Web服务开发的一个重要主题,主要涉及到使用Java API for XML Web Services(JAX-WS)创建和部署基于SOAP的Web服务。JAX-WS是一种标准的、Java平台上的API,它使得开发人员能够轻松地...

    Asynchronous Web Service Invocation with JAX-WS 2.0

    JAX-WS 2.0 是Java API for XML Web Services的第二个主要版本,它引入了异步Web服务调用的功能,以解决在Service-Oriented Architecture(SOA)环境中开发响应迅速的Web服务客户端应用程序的挑战。由于Web服务调用...

    cxf客户端所需jar包-4个

    标题 "cxf客户端所需jar包-4个" 暗示了这四个JAR文件是Apache CXF框架中用于构建客户端应用程序的基本组件,使得开发者能够方便地调用Web服务。Apache CXF是一个开源的Java框架,它允许创建和消费Web服务,支持多种...

    上传一个基于Jax-ws的WebService

    6. **创建客户端**:可以使用JAX-WS的`wsimport`工具,根据WSDL文件自动生成客户端代码。生成的代码包括一个客户端代理类,用于调用远程Web服务。 7. **调用服务**:在客户端代码中,实例化代理类并调用其方法,...

Global site tag (gtag.js) - Google Analytics