最近项目中需要用到CXF,但是本人使用的MyEclipse Blue Edition
6.1居然没有集成CXF的支持。因此抽时间研究了下将Eclipse SOA Tools Platform插件集成到其中。
      MyEclipse Blue Edition 6.1中使用的Eclipse
Platform为3.3.2。因此本人下载了多个Eclipse 3.3.2版本的STP插件进行测试。最后发现STP
R200710161054版可以和MyEclipse Blue Edition 6.1版完美集成。
      此处可以下载STP
R200710161054 all in one版。
     
具体安装其实超简单,将下载的ZIP包解压到MyEclipse安装目录下的myeclipse目录中。此处需要特别小心,注
意:eclipse,feature和plugins目录可以覆盖;但是feature和plugins中的同名目录不能覆盖。
     
此外,由于STP插件中的文件的目录和文件名比较长,解压后可能会发生超过系统目录文件长度的错误。解决方法是将MyEclipse安装到磁盘根目录下的
一个短名称的目录中,比如C:"Blue等。
      这次来讲下如何利用该工具快速开发一个简单的WebService。
      本文中使用的CXF为apache-cxf-2.0.5-incubator。
一、对STP插件进行设置:
      启动MyEclipse Blue Edition 6.1。选择菜单Window->Preferences,
在对话框左侧的SOA Tools分支下,可以进行STP插件的设置。
      1. 添加CXF Runtime
      选中分支中的Installed Runtimes,点击Add;

      选择Apache CXF 2.0,然后Next;

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

      2. 其他设置
      选中JAX-WS,选择使用向导;

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


      点击OK,完成插件的设置。
二、开发WebService
      使用CXF开发WebService有两种模式:从Java接口开始;从WSDL文件开始。
      这里介绍从Java接口开始开发(从WSDL文件开始开发的方法,看完本文自然可以领悟了。)
      1. 新建项目
      选择菜单File->New->Project...,选
择SOA Tools下的JAX-WS Java First Project;

      输入项目名称,JavaFirst;

      选择Runtime;

      点击Finish即可建立项目。
      新建的项目最好手动建一个lib目录,然后将所有的cxf库文件都拷贝进来,然后删除项目build
path中由向导添加的库,自己手动将lib中的库添加进项目的build path中。此外,JRE最好也换一下。
      2. 创建包
     
选择菜单File->New->Package,创建一个叫com.javafirst.pk的包。
      3. 创建接口
     
在刚刚创建的包下面,通过File->New->Interface,创建一个叫Hello的接口。
      接口中代码如下:

 public interface Hello {
public interface Hello {
 public String echo(String msg);
    public String echo(String msg);
 }
} 
       4. 添加WebService annotation
      在Package
Explorer中,选中刚刚定义的接口,通过菜单SOA->JAX-WS->Create Web Service来添加;
      或者右键点击接口,在右键菜单中的JAX-WS Tools->Create Web
Service来添加。

      保留向导的缺省参数,生成WebService Annotaion。

添加annotation后的代码如下:
 @WebService(targetNamespace="http://pk.javafirst.com/", name="Hello")
@WebService(targetNamespace="http://pk.javafirst.com/", name="Hello")

 public interface Hello {
public interface Hello {
 public String echo(String msg);
    public String echo(String msg);
 }
} 
      5. Save(此处需要预先选择Project->Build
Automaticly)之后,插件会自动生成wsdl文件和一堆垃圾src。

此时,需要对wsdl文件进行编辑。需要修改的地方有3处:
a. 为了便于发布以及便于编程人员理解,下面代码中的arg0可以修改为接口中定义的msg;注意,一旦修改,则不能
通过后面生成的Client来测试了 。
 <xs:complexType name="echo">
<xs:complexType name="echo">
 <xs:sequence>
    <xs:sequence>
 <xs:element minOccurs="0" name="arg0" type="xs:string" />
        <xs:element minOccurs="0" name="arg0" type="xs:string" />
 </xs:sequence>
    </xs:sequence>
 </xs:complexType>
</xs:complexType> 
 <xs:complexType name="echo">
<xs:complexType name="echo">
 <xs:sequence>
    <xs:sequence>
 <xs:element minOccurs="0" name="msg" type="xs:string" />
        <xs:element minOccurs="0" name="msg" type="xs:string" />
 </xs:sequence>
    </xs:sequence>
 </xs:complexType>
</xs:complexType> 
b. 为了兼容.net需要将parameters等替换。
 <wsdl:message name="echoResponse">
<wsdl:message name="echoResponse">
 <wsdl:part name="parameters" element="tns:echoResponse">
    <wsdl:part name="parameters" element="tns:echoResponse">
 </wsdl:part>
    </wsdl:part>
 </wsdl:message>
</wsdl:message>
 <wsdl:message name="echo">
<wsdl:message name="echo">
 <wsdl:part name="parameters" element="tns:echo"></wsdl:part>
    <wsdl:part name="parameters" element="tns:echo"></wsdl:part>
 </wsdl:message>
</wsdl:message> 
 <wsdl:message name="echoResponse">
<wsdl:message name="echoResponse">
 <wsdl:part name="echoOutput" element="tns:echoResponse">
    <wsdl:part name="echoOutput" element="tns:echoResponse">
 </wsdl:part>
    </wsdl:part>
 </wsdl:message>
</wsdl:message>
 <wsdl:message name="echo">
<wsdl:message name="echo">
 <wsdl:part name="echoInput" element="tns:echo"></wsdl:part>
    <wsdl:part name="echoInput" element="tns:echo"></wsdl:part>
 </wsdl:message>
</wsdl:message> 
c. wsdl发布的端口
修改格式为 http://<服务器URL>:<服务器端口>/<项目名>
 <wsdl:service name="HelloService">
<wsdl:service name="HelloService">
 <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
    <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
 <soap12:address location="http://localhost:9090/hello" />
    <soap12:address location="http://localhost:9090/hello" />
 </wsdl:port>
    </wsdl:port>
 </wsdl:service>
</wsdl:service> 
 <wsdl:service name="HelloService">
<wsdl:service name="HelloService">
 <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
    <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
 <soap12:address location="http://localhost:8088/JavaFirst" />
        <soap12:address location="http://localhost:8088/JavaFirst" />
 </wsdl:port>
    </wsdl:port>
 </wsdl:service>
</wsdl:service> 
      6. 删除所有的垃圾src。

      7. 右键点击wsdl文件,通过JAX-WS Tools->Generate
Code生成新的接口和实现代码。

其中的Client和Server是用于脱离容器测试WebService的,一般都选上。
最后生成的文件列表如图所示:

        8. 编辑HelloImpl.java文件
简单的返回输入值:

 public class HelloImpl implements Hello {
public class HelloImpl implements Hello {

 private static final Logger LOG = Logger.getLogger(HelloImpl.class.getName());
    private static final Logger LOG = Logger.getLogger(HelloImpl.class.getName());


 /* (non-Javadoc)
    /* (non-Javadoc)
 * @see com.javafirst.pk.Hello#echo(java.lang.String  msg )*
     * @see com.javafirst.pk.Hello#echo(java.lang.String  msg )*
 */
     */

 public java.lang.String echo(java.lang.String msg) {
    public java.lang.String echo(java.lang.String msg) { 
 LOG.info("Executing operation echo");
        LOG.info("Executing operation echo");
 System.out.println(msg);
        System.out.println(msg);

 try {
        try {
 java.lang.String _return = msg;
            java.lang.String _return = msg;
 return _return;
            return _return;

 } catch (Exception ex) {
        } catch (Exception ex) {
 ex.printStackTrace();
            ex.printStackTrace();
 throw new RuntimeException(ex);
            throw new RuntimeException(ex);
 }
        }
 }
    }

 }
} 
      9. 发布
      右键点击wsdl文件,选择菜单Build Package...即可生成war包。
     
注意此war包中没有包含任何的库文件,因此需要手动打包(比如用winrar之类),将lib目录添加到war包中的WEB-INF目录下。
      将此war包发布到应用服务器,即可。
      此时,发布的wsdl的端口是http://<server>:<port>/<context
root>/services/<项目名>
      这里所谓context root在WAS中就是发布WAR包时的上下文根,在tomcat中默认就是项目名。
     
因此,可以将wsdl文件中的地址和端口做相应的改动,注意修改了此处,如果用生成的Client来测试的话,Client中的相应地址也要改为和此处一
致。
 <wsdl:service name="HelloService">
<wsdl:service name="HelloService">
 <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
    <wsdl:port name="HelloPort" binding="tns:HelloServiceSoapBinding">
 <soap12:address location="http://localhost:8088/Hello/services/Hello" />
        <soap12:address location="http://localhost:8088/Hello/services/Hello" />
 </wsdl:port>
    </wsdl:port>
 </wsdl:service>
</wsdl:service> 
然后再重新打包,发布一次。
至此,一个简单的WebSerive已经发布成功。