博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用cxf编写基于spring的web service
阅读量:4185 次
发布时间:2019-05-26

本文共 5464 字,大约阅读时间需要 18 分钟。

文章目录

在开发过程中,大多数情况下,我们都是基于spring框架进行开发的,现在我们就来学习一下,用CXF编写基于spring的web service。

server端编码

1、创建spring的配置文件beans.xml,在其中配置SEI

2、在web.xml中,配置CXF的一些核心组件
服务端案例:
实体类

package bean;public class Order {  private int id;   private String name;  private double price;  public Order(int id, String name, double price) {	super();	this.id = id;	this.name = name;	this.price = 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;}  }

发布的接口

package spring;import javax.jws.WebMethod;import javax.jws.WebService;import bean.Order;@WebServicepublic interface OrderWS {	@WebMethod    public Order getOrderById(int id);}

接口的实现类

package spring;import bean.Order;public class OrderWSImpl implements OrderWS {   public OrderWSImpl(){	   System.out.println("OrderWSImpl class 。。。。。");   }   	@Override	public Order getOrderById(int id) {		System.out.println("server getOrde4rById() " + id);		return new Order(id,"feiji",100000);	}}

spring 的xml文件配置

web.xml的配置

day02_ws_cxf_spring
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
contextConfigLocation
classpath:beans.xml
org.springframework.web.context.ContextLoaderListener
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
CXFServlet
/*

启动项目范问http://localhost:8080/wx-cxf-server-spring/orderws?wsdl就可以访问该接口返回的wsdl文档

client端编码

1、生成客户端代码

2、创建客户端的spring 配置文件beans-client.xml,并配置
3、编写测试类请求web service
在客户端项目的src目录下,执行命令:wsdl2java http://localhost:8080/wx-cxf-server-spring/orderws?wsdl生成客户端代码。
创建spring的client-beans.xml配置文件

客户端接口的测试

package test;import org.springframework.context.support.ClassPathXmlApplicationContext;import spring.Order;import spring.OrderWS;public class ClientTest {   public static void main(String[] args) {	   ClassPathXmlApplicationContext  context = new ClassPathXmlApplicationContext(new String[]{"client-beans.xml"});	   OrderWS client = (OrderWS)context.getBean("orderClient");	   Order order = client.getOrderById(24);	   System.out.println(order);}}

启动main方法,这个时候客户端代码和服务端代码都会有输出。

基于spring的web service的自定义拦截器

1、 server端:

  • 在beans.xml中,在endpoint中配置上入拦截器。
    服务端检查用户拦截器示例:
package interceptor;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;import org.w3c.dom.Node;/** * 检查用户的拦截器 * @author Administrator * */public class CheckUserInterceptor extends AbstractPhaseInterceptor
{ public CheckUserInterceptor(){ super(Phase.PRE_PROTOCOL); System.out.println("CheckUserInterceptor()......."); } @Override public void handleMessage(SoapMessage message) throws Fault { Header header = message.getHeader(new QName("atguigu")); if(header != null){ Element atguigu = (Element)header.getObject(); String name = atguigu.getElementsByTagName("name").item(0).getTextContent(); Node node = atguigu.getElementsByTagName("password").item(0); String password = node.getTextContent(); if("xfzhang".equals(name) && "123456".equals(password)){ System.out.println("server 通过拦截器。。。。。"); return ; } } //不能通过 System.out.println("server 没有通过拦截器.... "); throw new Fault(new RuntimeException("请求需要一个正确的用户名密码!")); } }

在服务端的xml文件中添加拦截器的配置

2、Client端

客户端的添加用户拦截器:

public class AddUserInterceptor extends AbstractPhaseInterceptor
{ private String name; private String password; public AddUserInterceptor(String name, String password) { super(Phase.PRE_PROTOCOL);//准备协议化时拦截 this.name = name; this.password = password; System.out.println("AddUserInterceptor()...."); } /*
xfzhang
123456
xfzhang
123456
BOB
*/ @SuppressWarnings("deprecation") @Override public void handleMessage(SoapMessage msg) throws Fault { List
headers = msg.getHeaders(); /*
xfzhang
123456
*/ Document document = DOMHelper.createDocument(); Element rootEle = document.createElement("atguigu"); Element nameELe = document.createElement("name"); nameELe.setTextContent(name); rootEle.appendChild(nameELe); Element passwordELe = document.createElement("password"); passwordELe.setTextContent(password); rootEle.appendChild(passwordELe); headers.add(new Header(new QName("atguigu"), rootEle)); System.out.println("client handleMessage()...."); }}

在客户端xml中配置出拦截器

转载地址:http://cnfoi.baihongyu.com/

你可能感兴趣的文章
Mysql 工作原理
查看>>
数据库Oracle工作原理
查看>>
DB2数据库基本特性和概念简介
查看>>
SQL索引一步到位
查看>>
SQL行转列汇总
查看>>
sqlserver、db2、oracle存储过程动态sql语句示例
查看>>
DB2和oracle以及MS的SQL Server比
查看>>
jsf中xhtml文件访问
查看>>
数据库中CHAR,VARCHAR,TEXT等字段的区别
查看>>
greenplum 与 hbase的区别
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
Elasticsearch、MongoDB和Hadoop比较
查看>>
Elasticsearch与hadoop比较
查看>>
外地人一年内直接落户上海
查看>>
测试用例设计--因果图
查看>>
Kafka 对比 ActiveMQ
查看>>
架构以及我理解中架构的本质
查看>>
如何将Lucene索引写入Hadoop1.x的HDFS系统
查看>>
标量数据类型
查看>>
Lucene 或者 solr 有什么不一样
查看>>