webservice cxf与spring详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: wsdl文档结构图JDK方式开发server端代码package server;import javax.jws.WebMethod;import javax.jws.WebService;/** *  *  * SEI:Service Endpoint Interface 发布的服务接口 * */@WebServicepublic interface He


wsdl文档结构图

wKiom1ZMVDyQVc4QAAF5AdHQQEQ210.png


  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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
254 0
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
|
6月前
|
XML Java 应用服务中间件
WebService - Axis2与Spring整合并发布多个service(同样使用services.xml)
WebService - Axis2与Spring整合并发布多个service(同样使用services.xml)
551 0
|
6月前
|
Java 应用服务中间件 Spring
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
150 0
|
6月前
|
Java 应用服务中间件 Spring
WebService - CXF 与Spring整合(Service+Client)
WebService - CXF 与Spring整合(Service+Client)
67 0
|
XML Java 数据格式
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
184 0
java WebService CXF Spring 自定义拦截器 附实例源码
|
XML Java Apache
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
209 0
java WebService CXF Spring 自定义拦截器 附实例源码
|
XML 存储 Java
WebService对象调用spring注解
WebService对象调用spring注解
171 0
|
XML Java 数据格式
用cxf编写基于spring的webservice之上篇
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
958 0
|
数据安全/隐私保护 Java Spring
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。