您的位置:首页 > 其它

使用 CXF 做 webservice 简单例子

2017-02-07 11:10 363 查看
一、对比Axis2和CXF

jws的发布对java webservice框架产生了巨大的影响,经过大浪淘沙,目前java开发webservice的框架主要包括axis2和cxf。

axis2和cxf都是apache旗下的产品,但是其目的不同,导致webservice开发方法也不一样。两个框架都得到了开发者的支持。有必要对二者进行以下对比。
 
 Axis2CXF
目标WebService引擎简易的SOA框架,可以作为ESB
ws* 标准支持不支持WS-PolicyWS-Addressing,WS-Policy, WS-RM, WS-Security,WS-I Basic Profile
数据绑定支持XMLBeans、JiBX、JaxMe 、JaxBRI、ADBJAXB, Aegis, XMLBeans, SDO, JiBX
spring集成不支持支持
应用集成困难简单
多语言支持C/C++不支持
部署web应用嵌入式
服务监控和管理支持不支持
结论:
如果希望以一种一致的方式实现webservice,特别是有跨语言的需求时,应该使用Axis2
如果需要在现有的java程序(包括web应用)中增加webservice支持,应该使用CXF


二、编写服务类

从Java6开始,WebService API从Java EE复制到了Java SE。并遵循了一系列的标准,比如JSR181(Web Service 元数据),JSR224(JAX-WS,基于XML的WebService API),JSR67(SAAJ,SOAP附件标准)等。 并分别定义到javax.jws, javax.xml.ws 和 javax.xml.soap包中。

JSR181支持使用标注(annotation)来定义WebService。在javax.jws中主要的标注类包括:
 
标注说明
WebService将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service 接口
WebMethod定制Web Service方法
WebParam定制Web Service方法的参数
WebResult定制Web Service方法的返回值
SOAPBinding指定WebService的SOAP映射样式
使用标注可以在不改变代码逻辑的前提下让外部代码能够获得更多的元数据。下面就用javax.jws定义的标注来声明一个WebService

pom增加CXF依赖
     <dependencies
>
           
<dependency
>
                
<groupId
>org.apache.cxf
</groupId
>
                
<artifactId
>apache-cxf</artifactId
>
                
<version
>${cxf.version}
</version
>
                
<type
>pom</type>
           
</dependency
>
     </dependencies
>

     <properties
>
           
<cxf.version
>2.2.4
</cxf.version
>

     </properties
>
增加接口服务

package
com.dogiant.demo;
[align=left]
[/align]
import
javax.jws.WebService;
[align=left]
[/align]
[align=left]@WebService[/align]
public
interface
CXFDemo {
     public
String sayHello(String
foo);

[align=left]}[/align]

实现服务类

package
com.dogiant.demo;
[align=left]
[/align]
import
javax.jws.WebService;
[align=left]
[/align]
@WebService
(endpointInterface =
"com.dogiant.demo.CXFDemo", serviceName =
"cxfDemo"
)
public
class
CXFDemoImpl
implements
CXFDemo {
[align=left]
[/align]
[align=left]     @Override[/align]
     public
String sayHello(String
foo) {
           
return
"hello "+
foo;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]三、以endpoint发布[/align]

到目前为止,使用的都是标准Java SE中的东西。下面要开始依赖CXF实现一些功能。

首先是服务的发布。CXF不仅支持通过Web容器发布WebService,也可以在嵌入式代码中通过jetty发布WebService。

下面的测试类包含了发布服务和客户端调用的代码:
           
<dependency
>
                
<groupId
>junit</groupId>
                
<artifactId
>junit</artifactId>
                
<version
>4.12
</version
>
                
<scope
>test
</scope
>
           
</dependency
>
[align=left]
[/align]

package
com.dogiant.demo;
[align=left]
[/align]
import
javax.xml.ws.Endpoint;
[align=left]
[/align]
import
org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import
org.junit.Assert;
[align=left]
[/align]
import
junit.framework.TestCase;
[align=left]
[/align]
public
class
TestEndpoint
extends
TestCase {
[align=left]     [/align]
     private
static
final
String
ADDRESS
=
"http://localhost:9000/cxfdemo"
;
[align=left]
[/align]
     protected
void
setUp()
throws
Exception {
           
super.setUp();
[align=left]
[/align]
           System.
out.println(
"Starting Server");
           CXFDemoImpl
demo
=
new
CXFDemoImpl();
[align=left]
[/align]
           Endpoint.
publish(ADDRESS,
demo);
           System.
out.println(
"Start success");
[align=left]     }[/align]
[align=left]
[/align]
     public
void
testSayHello() {
[align=left]
[/align]
           JaxWsProxyFactoryBean
factory
=
new
JaxWsProxyFactoryBean();
           
factory.setServiceClass(CXFDemo.
class);
           
factory.setAddress(
ADDRESS);
           CXFDemo
client
= (CXFDemo)
factory.create();
           Assert.
assertEquals(client.sayHello("foo"),
"hello foo");
[align=left]     }[/align]

[align=left]}[/align]
[align=left]
[/align]

[align=left]信息: Creating Service {http://demo.dogiant.com/}CXFDemoImplService from class com.dogiant.demo.CXFDemo[/align]
[align=left]2016-3-28 10:49:48 org.apache.cxf.endpoint.ServerImpl initDestination[/align]
[align=left]信息: Setting the server's publish address to be http://localhost:9000/cxfdemo[/align] [align=left]2016-3-28 10:49:48 org.mortbay.log.Slf4jLog info[/align]
[align=left]信息: Logging to org.slf4j.impl.JDK14LoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog[/align]
[align=left]2016-3-28 10:49:48 org.mortbay.log.Slf4jLog info[/align]
[align=left]信息: jetty-6.1.21[/align]
[align=left]2016-3-28 10:49:48 org.mortbay.log.Slf4jLog info[/align]
[align=left]信息: Started SelectChannelConnector@0.0.0.0:9000[/align]
[align=left]Start success[/align]
[align=left]2016-3-28 10:49:48 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass[/align]

[align=left]信息: Creating Service {http://demo.dogiant.com/}CXFDemoService from class com.dogiant.demo.CXFDemo[/align]

四、在webapp中发布
web.xml

<?xml
version="1.0"
encoding=
"UTF-8"?>
<web-app
xmlns=
"http://java.sun.com/xml/ns/javaee"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
[align=left]     version="2.5">[/align]
[align=left]
[/align]
     <display-name
>spring-
cxf-demo</display-name
>
[align=left]     [/align]
     <context-param
>
           
<param-name
>contextConfigLocation
</param-name
>
           
<param-value
>classpath*:spring/spring-config*.
xml
</param-value>
     </context-param
>
[align=left]     [/align]
     <listener
>
          
<listener-class
>org.springframework.web.context.ContextLoaderListener
</listener-class
>
     </listener
>
[align=left]     [/align]
     <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
>/services/*
</url-pattern
>
     </servlet-mapping
>
[align=left]
[/align]

</web-app>

spring-config-cxf.xml

<?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"
[align=left]     xsi:schemaLocation="http://cxf.apache.org/jaxws[/align]
[align=left]     http://cxf.apache.org/schemas/jaxws.xsd[/align]
[align=left]     http://www.springframework.org/schema/beans[/align]
     http://www.springframework.org/schema/beans/spring-beans.xsd"
>
[align=left]
[/align]
[align=left]
[/align]
     <import
resource
="classpath:META-INF/cxf/cxf.xml"
/>
     <import
resource=
"classpath:META-INF/cxf/cxf-extension-soap.xml"
/>
     <import
resource
="classpath:META-INF/cxf/cxf-servlet.xml"
/>
[align=left]
[/align]
     <jaxws:endpoint
id
="cxfDemo"
implementor=
"com.dogiant.demo.CXFDemoImpl"
           
address=
"/cxfdemo"
/>
[align=left]
[/align]
[align=left]
[/align]

[align=left]</beans>[/align]
http://localhost:8080/services/cxfdemo


           
<dependency
>
                
<groupId
>javax.servlet
</groupId
>
                
<artifactId
>servlet-api</artifactId
>

                
<version
>2.5
</version
>
                
<scope
>provided
</scope
>   //此处不注意会报错

           
</dependency
>

http://localhost:8080/services/cxfdemo?wsdl

五、客户端

package
com.dogiant.demo;
[align=left]
[/align]
import
org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
[align=left]
[/align]
public
class
CXFClient {

     public
static
void
main(String[]
args) {
      JaxWsProxyFactoryBean
proxy
=
new
JaxWsProxyFactoryBean();
           proxy.setServiceClass(CXFDemo.
class);
           proxy.setAddress(
"http://localhost:8080/services/cxfdemo"
);
           CXFDemo
cxf
= (CXFDemo)
proxy.create();
           System.
out.println(
cxf.sayHello(
"haha"));

[align=left]     }[/align]

[align=left]}[/align]
[align=left]
[/align]
[align=left]与spring集成[/align]
[align=left]
[/align]

<?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"
[align=left]     xsi:schemaLocation="http://cxf.apache.org/jaxws[/align]
[align=left]     http://cxf.apache.org/schemas/jaxws.xsd[/align]
[align=left]     http://www.springframework.org/schema/beans[/align]
     http://www.springframework.org/schema/beans/spring-beans.xsd"
>
[align=left]
[/align]
     <bean
id
="clientFactory"
class=
"org.apache.cxf.jaxws.JaxWsProxyFactoryBean"
>
           
<property
name
="serviceClass"
value=
"com.dogiant.demo.CXFDemo"
/>
           
<property
name
="address"
value=
"http://localhost:8080/services/cxfdemo"
/>
     </bean
>
[align=left]
[/align]
     <bean
id
="client"
class="com.dogiant.demo.CXFDemo"
factory-bean="clientFactory"
           
factory-method=
"create"
/>
[align=left]
[/align]

[align=left]</beans>[/align]
[align=left]
[/align]
测试用例

package
com.dogiant.demo;
[align=left]
[/align]
import
org.junit.Test;
import
org.junit.runner.RunWith;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.test.context.ContextConfiguration;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
[align=left]
[/align]
@RunWith(SpringJUnit4ClassRunner.
class)
@ContextConfiguration(locations = {"classpath:spring/spring-config-cxf-client.xml"
})
public
class
TestCXFClient {
[align=left]     [/align]
[align=left]     @Autowired[/align]
     private
CXFDemo
client;
[align=left]     [/align]
[align=left]     @Test[/align]
     public
void
test() {
           System.
out.println(
client.sayHello(
"hello"));
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]

附:

cxf官网 
February 8, 2016 - Apache CXF 3.1.5/3.0.8 released!
http://cxf.apache.org/index.html

cxf-demo例子

https://github.com/dogiant/cxf-demo 

cxf官网 
February 8, 2016 - Apache CXF 3.1.5/3.0.8 released!
http://cxf.apache.org/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAX-WS JAX-RS CXF webservice