使用CXF2.1的STP插件开发WebService

来源:互联网 发布:南极游 网络 编辑:程序博客网 时间:2024/04/29 03:08

      前2篇(12)文章讲了如何用CXF2.0 在MyEclipse Blue Edition 6.1下开发WebService。但是CXF2.0版的STP插件很弱,而且生成一堆垃圾文件。因此,本文讲解如何在Eclipse下,用CXF2.1版的STP插件来开发一个简单的WebService。

      由于CXF2.1版的STP插件是在Eclipse 3.4M4版上开发的,因此MyEclipse Blue Edition 6.1不能使用。本文使用的组合是Eclipse SDK 3.4M4STP S200801091442 all in one版apache-cxf-2.1-incubator-SNAPSHOT

      具体安装很简单,将Eclipse解压到C盘根目录,然后将STP中的feature和plugins目录覆盖Eclipse SDK中的feature和plugins目录。注意,feature和plugins中的同名目录不能覆盖。然后将cxf 2.1解压到任意目录。准备工作完成。

 一、对STP插件进行设置

      启动Eclipse 3.4M4,选择菜单Window->Preferences,在对话框左侧的SOA Tools分支下,可以进行STP插件的设置。

      1. 添加CXF Runtime

      选中分支中的Installed Runtimes,点击Add;

      选择Apache CXF 2.0,然后Next;

      浏览至apache-cxf-2.1-incubator-SNAPSHOT的解压目录,点击Finish。注意此处的JRE是插件运行的JRE,最好选择Sun的JRE1.5(我选IBM JRE的时候插件出错)。

      2. 其他设置

      选中JAX-WS,选择使用向导;

 

      设定生成WSDL文件的Soap协议版本;

点击OK,完成插件的设置。

二、开发WebService

      使用CXF开发WebService有两种模式:从Java接口开始;从WSDL文件开始。

      介绍从Java接口开始开发。

      1. 新建项目

      选择菜单File->New->Java Project,建立一个叫JavaFirst的空java项目;

      选择菜单File->New->Package,创建一个叫com.javafirst.pk的包。

      再创建一个叫Hello的Interface,代码如下:

public interface Hello {
    
public String echo(String msg);
}

      2. 添加JAX-WS能力

     在Package Explorer中选中项目的根,选择Eclipse菜单SOA->JAX-WS->Enable JAX-WS;在弹出的对话框中选择Java First Programming Mode。

选择Runtime:

选择刚刚建立的接口文件:

一路OK完成添加能力。

这里最好在项目中增加一个lib文件夹,将apache-cxf-2.1-incubator-SNAPSHOT中的lib文件都paste进去;然后在项目的Build Path中删去cxf的runtime,然后手动添加lib中的jar文件;此外JRE也最好另外指定一个。

      2. 生成代码

      在Package Explorer中右键点击项目的根,选择右键菜单中JAX-WS Tools->Generate Code:

 

其中的Server和Client用于脱离容器测试本WebService,这里就选上吧。

      点击Finish。此时的文件列表如图所示:

      3. 编辑wsdl文件

      自动生成的JavaFirst.wsdl文件有3处(可能)需要修改:

a. 为了便于发布以及便于编程人员理解,下面代码中的arg0可以修改为接口中定义的msg;注意,一旦修改,则不能通过后面生成的Client来测试了 。(这里我们先不修改。)

<xsd:complexType name="echo">
    
<xsd:sequence>
        
<xsd:element minOccurs="0" name="arg0" type="xsd:string" />
    
</xsd:sequence>
</xsd:complexType>

 

<xsd:complexType name="echo">
    
<xsd:sequence>
        
<xsd:element minOccurs="0" name="msg" type="xsd:string" />
    
</xsd:sequence>
</xsd:complexType>

b. 为了兼容.net需要将parameters等替换。

<wsdl:message name="echo">
    
<wsdl:part name="parameters" element="tns:echo">
    
</wsdl:part>
</wsdl:message>
<wsdl:message name="echoResponse">
    
<wsdl:part name="parameters" element="tns:echoResponse">
    
</wsdl:part>
</wsdl:message>

 

<wsdl:message name="echo">
    
<wsdl:part name="echoInput" element="tns:echo">
    
</wsdl:part>
</wsdl:message>
<wsdl:message name="echoResponse">
    
<wsdl:part name="echoOutput" element="tns:echoResponse">
    
</wsdl:part>
</wsdl:message>

c. wsdl发布的端口

修改格式为 http://<服务器URL>:<服务器端口>/<项目名>

<wsdl:service name="Hello">
    
<wsdl:port name="HelloPort" binding="tns:HelloSoapBinding">
        
<soap:address location="http://localhost:9090/HelloPort" />
    
</wsdl:port>
</wsdl:service>

 

<wsdl:service name="Hello">
    
<wsdl:port name="HelloPort" binding="tns:HelloSoapBinding">
        
<soap:address location="http://localhost:8888/JavaFirst" />
    
</wsdl:port>
</wsdl:service>

      4. 编辑HelloImpl.java文件

      简单的返回输入值:

public class HelloImpl implements Hello {

    
public java.lang.String echo(java.lang.String arg0) {  
        System.out.println(arg0);    
        
try {
            java.lang.String _return 
= arg0;
            
return _return;
        }
 catch (Exception ex) {
            ex.printStackTrace();
            
throw new RuntimeException(ex);
        }

 
    }


}

      5. 打包发布

      在Package Explorer中右键点击wsdl文件,选择菜单Build Package...即可生成war包。

      注意此war包中没有包含任何的库文件,因此需要手动打包(比如用winrar之类),将lib目录添加到war包中的WEB-INF目录下。

      将此war包发布到应用服务器,即可。

      此时,发布的wsdl的端口是http://<server>:<port>/<context root>/services/<项目名>

      这里所谓context root在WAS中就是发布WAR包时的上下文根,在tomcat中默认就是项目名。

三、测试发布的WebService

      用其插件自动生成的Server和Client可以对WebService的逻辑进行测试。

只需修改Client代码如下:

 

public class HelloClient {

    
public static void main(String[] args) throws Exception {
        QName serviceName 
= new QName("http://pk.javafirst.com/""HelloService");
        QName portName 
= new QName("http://pk.javafirst.com/""HelloPort");

        Service service 
= Service.create(serviceName);
        service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING,
                        
"http://localhost:9090/HelloPort"); 
        com.javafirst.pk.Hello client 
= service.getPort(portName,  com.javafirst.pk.Hello.class);
        
        
// Insert code to invoke methods on the client here
        String msg = "Hello";
        String echo 
= client.echo(msg);
        System.out.println(echo);
    }


}

 

Server无需修改任何代码。

      之后先运行Server,再运行Client即可。

      另一种方式是Client调用刚刚发布的WebService进行测试。修改Client的代码如下(最主要是改wsdl的端口):

public class HelloClient {

    
public static void main(String[] args) throws Exception {
        QName serviceName 
= new QName("http://pk.javafirst.com/""HelloService");
        QName portName 
= new QName("http://pk.javafirst.com/""HelloPort");

        Service service 
= Service.create(serviceName);
        service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING,
                        
"http://localhost:8888/JavaFirst/services/JavaFirst"); 
        com.javafirst.pk.Hello client 
= service.getPort(portName,  com.javafirst.pk.Hello.class);
        
        
// Insert code to invoke methods on the client here
        String msg = "Hello";
        String echo 
= client.echo(msg);
        System.out.println(echo);
    }


}

之后运行Client,即可进行测试(当然前提是WebService正在应用服务器上运行)。

完。

原创粉丝点击