lzqlawrence 2011-10-13
使用Myeclipse 8.5开发基于JAX-WS的Web service实例
本文为Webservice开发入门篇,主要介绍在Myeclipse8.5环境下开发Webservice的服务程序和客户端程序的基本流程。
在Weblogic10.3.4中部署Webservice服务。
开发环境如下:
JAVAIDE:Myeclipse8.5
Webserver:Weblogic10.3.4
开发Webservice服务程序,需要了解以下相关内容,WSDL,SOAP,XML。这些是组成Webservice的基础。
在Myeclipse8.5下开发Webservice程序,目前系统支持的开发框架有3个,JAX-WS,REST(JAX-RS),XFire。其中系统建议不要使用XFire的框架,可能是要被淘汰了(deprecated)。我们选择的是JAX-WS框架。这个需要JavaEE5.0的支持。所以后面选择Webserver容器的时候,是要能支持JavaEE5.0的才可以部署成功。
(一)Webservice服务端开发
1. 新建一个Web service project, 菜单File -> New -> Web Service Project,在上面的框中输入项目名myWebSvc,框架选择 JAX-WS, J2EE只能选择Java EE 5.0。
Finish完成项目新建。
2. 新建一个 Java Bean, 就是一个普通的Class, File –> New -> Class,包名输入com.myweb.ws,类名输入SayHello,Finish结束新建类。
在类中加入一个方法sayHaha如下,
packagecom.myweb.ws;
publicclassSayHello
{
publicStringsayHaha(Stringrequest)
{
return"Haha,"+request+",O.K.!";
}
}
3. 新建一个Web service, 菜单File –> New -> Other -> MyEclipse -> Web Services -> Web Service,Next进入下一步,
选择 Create web service from java class(Bottom-up scenario),Next进入下一步,Javaclass输入com.myweb.ws.SayHello,选中GenerateWSDLinproject选项,
Finish结束新建。
生成新的服务代理类,com.myweb.ws.SayHelloDelegation
生成WSDL定义文件,WebRoot\WEB-INF\wsdl\SayHelloService.wsdl
WebRoot\WEB-INF\wsdl\SayHelloService_Schema1.xsd,
(二)部署Webservice服务
1.Window->ShowView->Servers,这里前提是已经安装完成Weblogic10.3.4,
在Weblogic10.x上点右键,选择AddDeployment部署myWebSvc,
Finish结束部署。
2.重启Weblogic服务,在浏览器输入http://localhost:7001/myWebSvc/SayHelloPort,如果显示正确,则服务发布成功。
3.在创建Webservice项目的过程中,如果加入了JAX-WS2.1Runtime/API库,在部署Webservice时,会报错误,
2011-10-1317:28:22[com.sun.xml.ws.policy.jaxws.BuilderHandler]getPolicySubjects
严重:[failedtolocalize]WSP_1014_POLICY_REFERENCE_DOES_NOT_EXIST(zip:D:/bea/weblogic1034/webdomain/servers/AdminServer/tmp/_WL_user/_appsdir_WebServicePro_dir/achpn5/war/WEB-INF/lib/webservices-rt.jar!/WEB-INF/wsdl/wsat.wsdl#Addressing_policy)
2011-10-1317:28:22[com.sun.xml.ws.policy.jaxws.PolicyWSDLParserExtension]finished
严重:[failedtolocalize]WSP_1014_POLICY_REFERENCE_DOES_NOT_EXIST(zip:D:/bea/weblogic1034/webdomain/servers/AdminServer/tmp/_WL_user/_appsdir_WebServicePro_dir/achpn5/war/WEB-INF/lib/webservices-rt.jar!/WEB-INF/wsdl/wsat.wsdl#Addressing_policy)
2011-10-1317:28:22[com.sun.xml.ws.policy.jaxws.PolicyWSDLParserExtension]finished
严重:[failedtolocalize]WSP_1018_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL()
com.sun.xml.ws.policy.PolicyException:[failedtolocalize]WSP_1014_POLICY_REFERENCE_DOES_NOT_EXIST(zip:D:/bea/weblogic1034/webdomain/servers/AdminServer/tmp/_WL_user/_appsdir_WebServicePro_dir/achpn5/war/WEB-INF/lib/webservices-rt.jar!/WEB-INF/wsdl/wsat.wsdl#Addressing_policy)
atcom.sun.xml.ws.policy.jaxws.BuilderHandler.getPolicies(BuilderHandler.java:93)
只要删去JAX-WS这两个包 ,再重新部署就可以了。4. 如果在Tomcat 6.0上部署,则需要加上JAX-WS API / Runtime 两个库,否则会报错,
严重: Error configuring application listener of class com.sun.xml.ws.transport.http.servlet.WSServletContextListener
java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4078)
(三)Webservice客户端开发
1.新建Javaproject,File->New->JavaProject,
输入项目名UseWS,Finish结束新建。
2. 新建Web service client程序, File –> New -> Other -> MyEclipse -> Web Services -> Web Service Client,Next 进入下一步,
WSDLFile为WebService的WSDL文件
E:\workspace\myWebSvc\WebRoot\WEB-INF\wsdl\SayHelloService.wsdl
Next进入下一步,Finish结束新建。
3. 新建一个Test类,用来调用 SayHelloService, File -> New -> Class,Finish结束类的新建。
修改类如下:
importcom.myweb.ws.SayHelloDelegate;
importcom.myweb.ws.SayHelloService;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Stringrequest="World";
Stringresponse=null;
SayHelloServicesayHelloSvc=newSayHelloService();
SayHelloDelegatesayHelloDgt=sayHelloSvc.getSayHelloPort();
response=sayHelloDgt.sayHaha(request);
System.out.println(response);
}
}
4.运行项目,发现一个错误,
Exceptioninthread"main"com.sun.xml.ws.client.ClientTransportException:HTTPtransporterror:java.net.ConnectException:Connectionrefused:connect
atcom.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:134)
atcom.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:140)
atcom.sun.xml.xwss.XWSSClientPipe.process(XWSSClientPipe.java:118)
atcom.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115)
atcom.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
atcom.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
atcom.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
atcom.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
atcom.sun.xml.ws.client.Stub.process(Stub.java:248)
atcom.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135)
atcom.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109)
atcom.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
atcom.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)
at$Proxy34.sayHaha(UnknownSource)
atTest.main(Test.java:15)
Causedby:java.net.ConnectException:Connectionrefused:connect
atjava.net.PlainSocketImpl.socketConnect(NativeMethod)
atjava.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
atjava.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
atjava.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
atjava.net.Socket.connect(Socket.java:507)
atjava.net.Socket.connect(Socket.java:457)
atsun.net.NetworkClient.doConnect(NetworkClient.java:157)
atsun.net.www.http.HttpClient.openServer(HttpClient.java:365)
atsun.net.www.http.HttpClient.openServer(HttpClient.java:477)
atsun.net.www.http.HttpClient.<init>(HttpClient.java:214)
atsun.net.www.http.HttpClient.New(HttpClient.java:287)
atsun.net.www.http.HttpClient.New(HttpClient.java:299)
atsun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:792)
atsun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:771)
atsun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:669)
atsun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:836)
atcom.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:122)
... 14 more错误显示是Connectionrefused,查看了SayHelloService.wsdl文件,发现这里的配置文件中,标签service的soap:addresslocation的端口是8080,而Weblogic中我们用的默认端口是7001,于是修改端口号为7001,
<servicename="SayHelloService">
<portbinding="tns:SayHelloPortBinding"name="SayHelloPort">
<soap:addresslocation="http://localhost:8080/myWebSvc/SayHelloPort"/>
</port>
</service>
修改为
<servicename="SayHelloService">
<portbinding="tns:SayHelloPortBinding"name="SayHelloPort">
<soap:addresslocation="http://localhost:7001/myWebSvc/SayHelloPort"/>
</port>
</service>
另外,如果不在同一台机器上测试,这里的localhost应该改为相应的IP地址。
修改后测试,显示成功。
Haha, World, O.K. !(全文完)
A.在myeclise中恢复例子开发环境:1>在myeclipse中新建一个web工程,项目名称自己任意取名,"J2EE Specification Level"一栏选择"J2EE1.4",然后点击"
SVN全称为Subversion,意为版本控制系统,SVN是一个很优秀的版本控制工具,用于团队开发中的多人文档操作的更新、处理和合并。SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。