9870780 发表于 2016-4-11 09:21:27

Apache CXF实现的SOAP形式的webservices

前言:常用的web service有两种形式,SOAP和RESTful。这里先说SOAP的实现步骤,RESTful的形式后面再说
一 建项目,导jar包
(1)项目结构

(2)在eclipse中新建一个动态web项目“CXFDemo”,并导入cxf中的jar包(路径:/WEB-INF/lib/)。当然,可以去官网下载,也可以直接使用我用过的jar包,链接:http://pan.baidu.com/s/1pKyelAV(3)配置web.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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"
    version="3.0">
    <display-name>CXFDemo</display-name>
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>WEB-INF/classes/service-beans.xml</param-value>
    </context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
      <servlet-name>CXFServlet</servlet-name>
      <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>CXFServlet</servlet-name>
      <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
      <welcome-file>index.html</welcome-file>
      <welcome-file>index.htm</welcome-file>
      <welcome-file>index.jsp</welcome-file>
      <welcome-file>default.html</welcome-file>
      <welcome-file>default.htm</welcome-file>
      <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>





二 web service服务端类(1)接口CXFService.java:
1
2
3
4
5
6
7
8
9
10
11
package cn.zifangsky;

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

@WebService
public interface CXFService {
    @WebMethod
    public String sayHello(@WebParam(name="name") String name);
}




说明:
@WebService:标记表示该接口是一个WebService服务
@WebMethod:标记表示WebService中的方法
@WebParam(name=”paramName”)表示方法中的参数,name属性限制了参数的名称,若没有指定该属性,参数将会被重命名(2)具体的实现类CXFServiceImpl.java:
1
2
3
4
5
6
7
8
9
10
11
package cn.zifangsky.impl;

import cn.zifangsky.CXFService;

public class CXFServiceImpl implements CXFService {

    public String sayHello(String name) {
      return "Hello," + name + "\n" + Test.getExtraMessage();
    }

}




注:Test.java类:

1
2
3
4
5
6
7
package cn.zifangsky.impl;

public class Test {
    public static String getExtraMessage(){
      return "测试";
    }
}




(3)配置service-beans.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:soap="http://cxf.apache.org/bindings/soap"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
    <bean id="loggingFeature" class="org.apache.cxf.feature.LoggingFeature" />
    <bean id="inLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
    <jaxws:server id="sayHelloServices" serviceClass="cn.zifangsky.CXFService" address="/soap/sayHello" >
      <jaxws:serviceBean>
            <bean class="cn.zifangsky.impl.CXFServiceImpl" />
      </jaxws:serviceBean>
      <jaxws:outInterceptors>
            <ref bean="outLoggingInterceptor" />
      </jaxws:outInterceptors>
      <jaxws:inInterceptors>
            <ref bean="inLoggingInterceptor" />
      </jaxws:inInterceptors>
      <jaxws:features>
            <ref bean="loggingFeature" />
            <wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing" />
      </jaxws:features>

    </jaxws:server>

</beans>




说明:i)3个bean配置的是日志,在这里把日志相关的配置删掉也不影响web service服务的正常使用ii)address指的是发布后这个服务的路径问题,比如说我这里就是:http://localhost:8080/CXFDemo/soap/sayHello(4)测试发布这个项目到tomcat,运行之后的效果如下:
点击那个链接,可以发现sayHello这个服务的地址是:http://localhost:8080/CXFDemo/soap/sayHello?wsdl到此,这个web service的服务端已经配置完成
三 web service客户端配置服务端提供服务,而客户端使用服务端提供的服务,因此客户端只需要调用服务端提供的服务就可以了(1)客户端的项目结构:
(2)同样是新建一个动态web工程,然后引入cxf的jar包,同时需要把服务端的CXFService接口打包成一个jar包,然后导入到客户端的lib中,链接:http://pan.baidu.com/s/1eQVWups

(3)客户端测试类ClientDemo.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package cn.zifangsky.client;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.zifangsky.CXFService;

public class ClientDemo {
    public static void main(String args[]){
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});

      CXFService clientHello = (CXFService) context.getBean("clientHello");
      String response = clientHello.sayHello("javaee");
      context.close();

      System.out.println("Response: " + response);   
      System.exit(0);
    }

}




(4)客户端配置文件client-beans.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"   
       xmlns:jaxws="http://cxf.apache.org/jaxws"   
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
          http://www.springframework.org/schema/beans/spring-beans.xsd   
          http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
    <bean id="loggingFeature" class="org.apache.cxf.feature.LoggingFeature" />
    <bean id="inLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />      
    <jaxws:client id="clientHello" serviceClass="cn.zifangsky.CXFService" address="http://localhost:8080/CXFDemo/soap/sayHello?wsdl">
      <jaxws:inInterceptors>
            <ref bean="inLoggingInterceptor" />
      </jaxws:inInterceptors>
      <jaxws:outInterceptors>
            <ref bean="outLoggingInterceptor" />
      </jaxws:outInterceptors>
      <jaxws:features>
            <ref bean="loggingFeature" />
            <wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing" />
      </jaxws:features>
    </jaxws:client>   
</beans>




说明:这里的address需要填写服务的wsdl绝对地址,因此这里就是:http://localhost:8080/CXFDemo/soap/sayHello?wsdl
(5)测试直接使用“Java Application”运行ClientDemo,输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---------------------------
ID: 1
Address: http://localhost:8080/CXFDemo/soap/sayHello?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><Action xmlns="http://www.w3.org/2005/08/addressing">http://zifangsky.cn/CXFService/sayHello</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:0d855e41-d638-4525-a3cf-8055c40f8605</MessageID><To xmlns="http://www.w3.org/2005/08/addressing">http://localhost:8080/CXFDemo/soap/sayHello?wsdl</To><ReplyTo xmlns="http://www.w3.org/2005/08/addressing"><Address>http://www.w3.org/2005/08/addressing/anonymous</Address></ReplyTo></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://zifangsky.cn/"><name>javaee</name></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
三月 14, 2016 4:51:41 下午 org.apache.cxf.services.CXFServiceService.CXFServicePort.CXFService
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=, Date=, Server=, transfer-encoding=}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><Action xmlns="http://www.w3.org/2005/08/addressing">http://zifangsky.cn/CXFService/sayHelloResponse</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:504f4c19-5df9-42bd-bb02-761da4932490</MessageID><To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To><RelatesTo xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:0d855e41-d638-4525-a3cf-8055c40f8605</RelatesTo></soap:Header><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://zifangsky.cn/"><return>Hello,javaee
测试</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------
三月 14, 2016 4:51:41 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@62a76581: startup date ; root of context hierarchy
Response: Hello,javaee
测试




可以发现,最后成功输出了

1
2
Response: Hello,javaee
测试




因为我们在客户端中只引用了CXFService.java这个接口,但是却输出了预期的内容,说明客户端的确是调用了服务端的服务并成功返回信息的


页: [1]
查看完整版本: Apache CXF实现的SOAP形式的webservices