webservice cxf与spring详解

wsdl文档结构图

  1. JDK方式开发

server端代码

package server;

import javax.jws.WebMethod;
import javax.jws.WebService;
/**
 * 
 * 
 * SEI:Service Endpoint Interface 发布的服务接口
 *
 */
@WebService
public interface HelloWS {
@WebMethod
    public String sayHello(String name);
}
package server;

import javax.jws.WebService;
/**
 * 
 * 
 * SEI的实现
 *
 */
@WebService
public class  HelloWSImpl  implements HelloWS{

    @Override
    public String sayHello(String name) {
        System.out.println("server sayHello()"+name);
        return "Hello"+name;
    }

}
package server;

import javax.xml.ws.Endpoint;

public class ServerPublish {

    
    public static void main(String[] args) {
        
        String address="http://localhost:8090/sayhello";
        //对应的wsdl文档地址http://localhost:8090/sayhello?wsdl
        Endpoint.publish(address, new HelloWSImpl());
        System.out.println("发布服务成功");
    }
}

根据wsdl文件生成客户端代码

远程
wsimport -keep 

.net代码写的需要修改里面的

<s:sequence>
    <s:element ref="s:schema"/>
    <s:any/>
</s:sequence>

为
  <s:sequence>
    <s:any minOccurs="2" maxOccurs="2" />
  </s:sequence>

 
本地
wsimport -keep  WeatherWS.wsdl

使用以下代码发送请求

package weather;

import java.util.List;

import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWS;
import cn.com.webxml.WeatherWSSoap;

public class ClientTest {

    public static void main(String[] args) {
        
        WeatherWS weatherWS  =new WeatherWS();
        
        WeatherWSSoap  weatherWSSoap =weatherWS.getWeatherWSSoap();
        ArrayOfString  arrayOfString= weatherWSSoap.getWeather("上海", null);
        List<String> list=arrayOfString.getString();
        System.out.println(list);
        for(String s:list){
            
            System.out.println(s+"***");
        }
        
    }
}

2.CXF方式

CXF支持map,jdk自带不支持map数据结构

使用wsdl2java +wsdl文件地址  生成客户端调用代码

cxf3.1.4添加日志服务器和客户端拦截器

服务器

package server;

import java.util.List;

import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

public class ServerPublish {

    
    public static void main(String[] args) {
        
        String address="http://localhost:8090/sayhello";
        HelloWSImpl hw = new HelloWSImpl();
        ServerFactoryBean sfb = new ServerFactoryBean();
        sfb.setServiceClass(HelloWS.class);
        sfb.setServiceBean(hw);
        sfb.setAddress(address);
        //服务器端的日志入拦截器
        List<Interceptor<? extends Message>> inInterceptors =sfb.getInInterceptors();
        inInterceptors.add(new LoggingInInterceptor() );
        
      //服务器端的日志出拦截器
        List<Interceptor<? extends Message>> outInterceptors =sfb.getOutInterceptors();
        outInterceptors.add(new LoggingOutInterceptor());
        sfb.create();
        System.out.println("发布服务成功");
    }
}

客户端

package client;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import server.HelloWS;
import server.HelloWSPortType;

public class client_test {

    public static void main(String[] args) {
        HelloWS helloWS = new HelloWS();
        HelloWSPortType helloWSPortType = helloWS.getHelloWSPort();
        Client client=ClientProxy.getClient(helloWSPortType);
         //客户端的日志入拦截器
        List<Interceptor<? extends Message>> inInterceptors =client.getInInterceptors();
        inInterceptors.add(new LoggingInInterceptor() );
        
      //客户端的日志出拦截器
        List<Interceptor<? extends Message>> outInterceptors =client.getOutInterceptors();
        outInterceptors.add(new LoggingOutInterceptor());
        
        String s=helloWSPortType.sayHello(" yuanhai");
        
        System.out.println(s);
    }
}

cxf添加自定义拦截器实现密码用户名验证

客户端拦截器

package client;

import java.util.List;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddUserInterceptor  extends AbstractPhaseInterceptor<SoapMessage>{

    
    private String name;
    private String password;
    public AddUserInterceptor(String name, String password) {
        super(Phase.PRE_PROTOCOL);//准备协议化时拦截
        this.name=name;
        this.password=password;
        
    
    }

    
    /*
     在soap中加个head
     <Envelope>
     <head>
         <atguigu>
             <name>yuanhai</name>
             <password>123456<password>
         </atguigu>
         <atguigu2>
             <name>yuanhai</name>
             <password>123456<password>
         </atguigu2>
     </head>
     <Body>
         <sayHello>
             <arg0>yuanhai</arg0>
         </sayHello>
     </Body>
     
     </Envelope>
     
     
     */
    @Override
    public void handleMessage(SoapMessage msg) throws Fault {
    List<Header> headers=    msg.getHeaders();
    
    Document document=DOMUtils.createDocument();
        Element rootEle=document.createElement("atguigu");
        Element nameEle=document.createElement("name");
        nameEle.setTextContent(name);
        Element passwordEle=document.createElement("password");
        passwordEle.setTextContent(password);
        rootEle.appendChild(nameEle);
        rootEle.appendChild(passwordEle);
        
        headers.add(new Header(new QName("atguigu"), rootEle));//QName必须跟rootEle的标签一样
        System.out.println("client handleMessage()...");
    }

    
    
}

调用代码

package client;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import server.HelloWS;
import server.HelloWSPortType;

public class client_test {

    public static void main(String[] args) {
        HelloWS helloWS = new HelloWS();
        HelloWSPortType helloWSPortType = helloWS.getHelloWSPort();
        
        Client client=ClientProxy.getClient(helloWSPortType);
         //客户端的日志入拦截器
        List<Interceptor<? extends Message>> inInterceptors =client.getInInterceptors();
        inInterceptors.add(new LoggingInInterceptor() );
        
      //客户端的日志出拦截器
        List<Interceptor<? extends Message>> outInterceptors =client.getOutInterceptors();
        outInterceptors.add(new LoggingOutInterceptor());
        outInterceptors.add(new AddUserInterceptor("yuanhai","123456"));
        String s=helloWSPortType.sayHello(" yuanhai");
        
        System.out.println(s);
    }
}

服务端拦截器

package server;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;

/*
 * 检查用户的拦截器
 */
public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    public CheckUserInterceptor() {
        super(Phase.PRE_PROTOCOL);
    
    }

    @Override
    public void handleMessage(SoapMessage msg) throws Fault {
        
    Header header=    msg.getHeader(new QName("atguigu"));
        if(header!=null){
            Element atguiguEle =(Element) header.getObject();
            
            String name=atguiguEle.getElementsByTagName("name").item(0).getTextContent();
            String password=atguiguEle.getElementsByTagName("password").item(0).getTextContent();
            if("yuanhai".equals(name)&&"123456".equals(password)){
                
                System.out.println("Server 通过拦截器...");
                return;
            }
            
        }
        //不能通过
        System.out.println("Server 未通过拦截器...");
        throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码"));
        
    }

}

调用代码

package server;

import java.util.List;

import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

public class ServerPublish {

    
    public static void main(String[] args) {
        
        String address="http://localhost:8090/sayhello";
        HelloWSImpl hw = new HelloWSImpl();
        ServerFactoryBean sfb = new ServerFactoryBean();
        sfb.setServiceClass(HelloWS.class);
        sfb.setServiceBean(hw);
        sfb.setAddress(address);
        //服务器端的日志入拦截器
        List<Interceptor<? extends Message>> inInterceptors =sfb.getInInterceptors();
        inInterceptors.add(new LoggingInInterceptor() );
        inInterceptors.add(new CheckUserInterceptor());
      //服务器端的日志出拦截器
        List<Interceptor<? extends Message>> outInterceptors =sfb.getOutInterceptors();
        outInterceptors.add(new LoggingOutInterceptor());
        sfb.create();
        System.out.println("发布服务成功");
    }
}

3.cxf与spring集成

server段代码

实体类order

package bean;

public class Order {
    
    public Order(int id, String name, double price) {
    
        this.id = id;
        this.name = name;
        this.price = price;
    }
    private int id;

    private String name;
    
    private double price;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    
}

webservice接口

package ws;

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

import bean.Order;
@WebService
public interface OrderWS {

    
    @WebMethod
    public Order getOrderById(int id);
}

webservice实现类

package ws;

import bean.Order;

public class OrderWsImpl  implements OrderWS {

    
    public OrderWsImpl(){
        System.out.println("OrderWsImpl()");
    }
    @Override
    public Order getOrderById(int id) {
        
        System.out.println("server getOrderById()"+id);
        return new Order(id, "飞机", 100000);
    }

}

spring配置文件beans.xml

<?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-3.0.xsd
           http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd">
        
        <!--  引入cxf的一些核心配置-->
    <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" /> -->

    <jaxws:endpoint id="orderWS" implementor="ws.OrderWsImpl" address="/orderws" >
    
    <jaxws:inInterceptors>
    <bean class="ws.CheckUserInterceptor"/>
    </jaxws:inInterceptors>
     </jaxws:endpoint>
    
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:web="http://java.sun.com/xml/ns/javaee" 
        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_2_5.xsd" version="2.5">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*: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>
</web-app>

客户端

spring配置文件client-beans.xml

<?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-3.0.xsd
           http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd">
        
    

    <jaxws:client id="orderClient" 
    serviceClass="ws.OrderWS" 
    address="http://localhost:8080/webservice_cxf_spring_server/orderws">
    
    <jaxws:outInterceptors>
    <bean class="test.AddUserInterceptor">
    <constructor-arg name="name" value="yuanhai"/>
    <constructor-arg name="password" value="123456"/>
    </bean>
    </jaxws:outInterceptors>
    
     </jaxws:client>
    
</beans>

客户端调用代码

package test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import ws.Order;
import ws.OrderWS;

public class client_test {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "client-beans.xml" });
        OrderWS orderWs = (OrderWS) context.getBean("orderClient");
        Order order = orderWs.getOrderById(24);
        System.out.println(order);
    }
}

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1714748

时间: 2024-10-31 22:12:58

webservice cxf与spring详解的相关文章

android调用web service(cxf)实例应用详解_Android

Google为ndroid平台开发Web Service提供了支持,提供了Ksoap2-android相关架包 1.下载该夹包可以直接登录http://code.google.com/p/ksoap2-android/,现在该站点已经提供了直接的下载,只要点击下载链接就可以下载了: 我现在的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 2.好了,现在我们就可以进行新建项目来进行测试了,首先我们先建立java服务端,这里的一些前期

android调用web service(cxf)实例应用详解

Google为ndroid平台开发Web Service提供了支持,提供了Ksoap2-android相关架包 1.下载该夹包可以直接登录http://code.google.com/p/ksoap2-android/,现在该站点已经提供了直接的下载,只要点击下载链接就可以下载了: 我现在的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 2.好了,现在我们就可以进行新建项目来进行测试了,首先我们先建立java服务端,这里的一些前期

解析利用wsdl.exe生成webservice代理类的详解_实用技巧

利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部分D:/Program Files/Microsoft Visual Studio 8/VC>wsdl /language:c# /n:TestDemo /out:d:/Temp/TestService.cs D:/Temp/TestService.wsdl在d:/Temp下就会产生一个TestServ

详解java开发webservice的几种方式_java

webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2 Axis是apache下一个开源的webservice开发组件,出现的算是比较早了,也比较成熟.这里主要介绍Axis+eclipse开发webservice,当然不用eclipse也可以开发和发布webservice,只是用eclipse会比较方便. (1)下载eclipse的Java EE版本http://www.jb51.net/softs/239903.

详解Spring事务Transaction配置的五种注入方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,

Spring学习(三) AOP详解

上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming),即面向切面编程. 1.OOP回顾 在介绍AOP之前先来回顾一下大家都比较熟悉的OOP(Object Oriented Programming).OOP主要是为了实现编程的重用性.灵活性和扩展性.它的几个特征分别是继承.封装.多态和抽象.OOP重点体现在编程架构,强调的是类之间的层次关系. 2.O

微框架Spring Boot详解

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发 展的快速应用开发领域(rapid application development)成为领导者. 多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖 管理.在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian

Spring MVC 详解

第一章 Web MVC简介Web MVC简介 1.1.Web开发中的请求-响应模型:   在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问http://sishuok.com 2.  Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html). 3.web服务器处理完成后,返回内容给web客户端(一般就是我们的浏览器),客户端对接收的内容进行处理(如web浏览器将会对接收到的html内容进行渲染以展示给客户)

spring学习笔记(11)@AspectJ研磨分析[2]切点表达式函数详解

Spring中的AspectJ切点表达式函数 切点表达式函数就像我们的GPS导航软件.通过切点表达式函数,再配合通配符和逻辑运算符的灵活运用,我们能很好定位到我们需要织入增强的连接点上.经过上面的铺垫,下面来看看Springz中支持的切点表达式函数. 1. 方法切点函数 函数 入参 说明 示例 execution() 方法匹配字符串 满足某一匹配模式的的所有目标类方法连接点 execution(* com.yc.service.*.*(..))在配置service层的事务管理时常用,定位于任意返