webservice与spring整合(基于CXF的webservice实现)

首先先来点理论

我想在这里有必要跟大家探讨一下jax-rs与soap

JAX-RS

JAX-RS提供了一些标注将一个资源类,一个POJO Java类,封装为Web资源。

JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署

 

soap

简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

webService三要素

编辑
SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration)之一, soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService 。具体实现可以搜索 Web Services简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象
 
下面步入CXF技术

1`.ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。ObjectWeb Celtix是

由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。
合并后的ApacheCXF融合该两个开源项目的功能精华,提供了实现SOA所需要的核心ESB功能框架,
包括SOA服务创建,服务路由,及一系列企业级QoS功能。

2.支持标准 
(1)JAX-WS, JSR-181, SAAJ, JAX-RS 
(2)SOAP 1.1, 1.2, WS-I BasicProfile, WS-Security, WS-Addressing, WS-RM, WS-Policy 
(3)WSDL 1.1 
(4)MTOM

3.传输方式,绑定,数据绑定,传送数据格式 
(1)绑定: SOAP, REST/HTTP 
(2)数据绑定: JAXB 2.x, Aegis, XMLBeans, SDO 
(3)传送数据格式: XML, JSON, FastInfoset 
(4)传输方式: HTTP, Servlet, JMS

首先是soap的方式发布webservice

pom

<properties>
        <!-- spring版本号 -->
        <spring.version>4.1.6.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-core</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.ws.rs/jsr311-api -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.0.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.0.5</version>
        </dependency>

        <!-- spring3 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

 

服务端的接口

 1 import javax.jws.WebParam;
 2 import javax.jws.WebService;
 3 
 4 import com.model.User;
 5 
 6 @WebService
 7 public interface BaseService {
 8     public String getUserName(@WebParam(name = "userId", header = true) String userId);
 9 
10     public String getUserAge(@WebParam(name = "userId") String userId);
11 
12     public User getUser(@WebParam(name = "userId") long userId);
13 }

接口实现

 1 import java.util.ArrayList;
 2 import java.util.Date;
 3 import java.util.List;
 4 
 5 import javax.jws.WebService;
 6 
 7 import com.model.User;
 8 
 9 @WebService
10 public class BaseServiceImpl implements BaseService {
11 
12     @Override
13     public String getUserName(String userId) {
14         String userName = "王立虎";
15         return userName;
16     }
17 
18     @Override
19     public String getUserAge(String userId) {
20         return new Date().toString();
21     }
22 
23     @Override
24     public User getUser(long userId) {
25 
26         User user = new User();
27         user.setEmail("www.email");
28         user.setId(userId);
29         List<String> name = new ArrayList<>();
30         name.add("zhangsan");
31         user.setName(name);
32         return user;
33     }
34 
35 }

spring的配置

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
 4     xsi:schemaLocation="http://cxf.apache.org/jaxws   
 5     http://cxf.apache.org/schemas/jaxws.xsd
 6     http://www.springframework.org/schema/beans   
 7     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
 8     default-lazy-init="true">
 9     <!-- <jaxws:endpoint address="soap/baseService"> <jaxws:implementor ref="baseServer" 
10         /> </jaxws:endpoint> <bean id="baseServer" class="com.testservice.BaseServiceImpl" 
11         /> -->
12     <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
13     <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
14     <bean id="baseServerImpl" class="com.soapservice.BaseServiceImpl" />
15 
16     <jaxws:server address="soap/baseService" serviceClass="com.soapservice.BaseService">
17         <jaxws:serviceBean>
18             <ref bean="baseServerImpl" />
19         </jaxws:serviceBean>
20         <jaxws:inInterceptors>
21             <ref bean="inMessageInterceptor" />
22         </jaxws:inInterceptors>
23         <jaxws:outInterceptors>
24             <ref bean="outLoggingInterceptor" />
25         </jaxws:outInterceptors>
26     </jaxws:server>
27 
28     <jaxws:client id="baseClient" serviceClass="com.soapservice.BaseService"
29         address="http://localhost:8080/WebServiceTest/cxf/soap/baseService" />
30 
31 
32 </beans>
33  

 

在这里我们为了体现spring总线编程思想我们将client也集成到spring上面

下面是测试代码

package com.testbase;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.model.User;
import com.soapservice.BaseService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:soapService.xml" })
public class TestEnvironment {

    @Autowired
    @Qualifier("baseClient")
    BaseService baseService;

    @Test
    public void testbase() {
        User user = this.baseService.getUser(666);
        System.out.println(user);
    }

}

当我们的服务器启动以后我们的服务端接口就发布出去了我们其实可也直接使用代理类来调用并不一定非得用上边的方式但是我们如果使用上边的方式就得加载spring配置文件

应为我们要用那个client的bean如果处在spring的环境的话就会有空指针异常,否则大家还有别的方式不用加载也可以告诉我,下面是使用代理类调用的源代码

 

1 public static void main(String[] args) {
2         JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
3         factoryBean.setServiceClass(BaseService.class); 
4         factoryBean.setAddress("http://localhost:8080/WebServiceTest/cxf/soap/baseService");
5         BaseService service = (BaseService) factoryBean.create();
6         System.err.println(service.getUserName(""));
7         System.out.println(service.getUserAge(""));  
8     }

 

posted @ 2016-09-04 21:02 奋斗,坚持 阅读(...) 评论(...)  编辑 收藏