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);
    }
}
时间: 2024-10-01 06:45:35

webservice cxf与spring详解的相关文章

WebService中的WSDL详解

WebService中的WSDL详解 有人在WebService开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户(或后台)给你一个WSDL文件(或网址),说按照上面的进行适配, 这时就要对WebService的WSDL有一定的理解,本文将对WSDL(WebService描述语言)进行详细总结. WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端

【WebService】wsdl配置详解以及使用注解修改wsdl配置

WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义WebService服务及其调用 前面分析了一下关于ws的基本知识,我们知道,wsdl是ws中很重要的文档,我们可以通过解析该wsdl文档获取ws的相关信息,其实,如果不了解该文档结构的话,问题也不大,只要会解析即可进行开发.但是如果想要生成一个符合自己项目的,或者比较人性化的一个wsdl的话,或者从可读性角度来说,就需要在编写ws代码时进行一些相应的配置了,比如说ws名称,

WebService—CXF整合Spring实现接口发布和调用过程2

一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.18</version> </dependency> <de

WebService—CXF整合Spring实现接口发布和调用过程

一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.18</version> </dependency> <de

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

解析利用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

Spring详解(六)------AOP 注解

上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 AOP 配置. 为了便于大家理解,讲解方式是这样的,我们先给出 xml 的配置,然后介绍如何通过 注解 来进行替代. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1dFdBHZF 密码:3v4k 1.xml 的方式实现 AOP ①.接口 UserService pack

Spring详解(三)------DI依赖注入

上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可能依赖于其他的对象,即类的属性如何赋值?这也是我们这篇博客讲解 Spring 另一个核心要点:DI依赖注入. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1c2xVUDi密码:v1h3 1.什么是DI依赖注入? spring动态的向某个对象提供它所需要的其他对象.这一点

Spring详解(五)------AOP

这章我们接着讲 Spring 的核心概念---AOP,这也是 Spring 框架中最为核心的一个概念. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1skZjg7r 密码:dn42 1.AOP 什么? AOP(Aspect Oriented Programming),通常称为面向切面编程.它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面.所谓&q