spring + cxf

目录

一、什么是cxf

二、CXF包

三、搭建项目

1.maven依赖

2.web.xml文件

3.启动的配置文件

4.发布的接口和实现

5. xml对应的对象

6. 启动

7. 模拟发送soap报文


整合spring 和cxf框架。

一、什么是cxf

CXF是建立在SOAP协议上的一个Web service框架。

什么事SOAP协议,简单来说就是两个不同项目(开发语言不同等)通过xml文件来描述要传输的东西,然后通过HTTP协议传输,接收方把收到的xml解析成需要的对象使用,返回的时候又用xml封装又通过http协议传输,如此就是SOAP协议。而CXF就是两个项目之间为了提供服务,而开发的一个开源框架,使用CXF框架可以快速搭建web service。CXF就是将项目中暴露出来的接口(服务)包装起来,成为wsdl,使用方通过wsdl来调用这些服务。
 

二、CXF包

首先肯定是下载cxf包了,当然了可以通过这个地址去下载https://mirror.bit.edu.cn/apache/cxf/3.3.6/

三、搭建项目

这个应该是大家最关注的点了,所以,我们开始

1.maven依赖

既然开始搭建项目,那么必不可少的就是依赖包了。不说了直接上代码。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.tzw</groupId>
    <artifactId>tzw-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.tzw</groupId>
  <artifactId>tzw-three</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>tzw-three Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <properties>
  
  	 <spring.version>4.3.16.RELEASE</spring.version>
  </properties>
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>


	<!-- cxf相关的包 -->
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-core</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-bindings-soap</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-bindings-xml</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-databinding-jaxb</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-frontend-jaxws</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-frontend-simple</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-transports-http</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-ws-addr</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-ws-policy</artifactId>
    	<version>3.2.5</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-wsdl</artifactId>
    	<version>3.2.5</version>
    </dependency>
    
    
    
    
    
    <!-- spring 的核心工具包 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- 包含web开发时,用到的Spring框架时所需的核心类,包括WebApplicationContext\struts和jsp集成的类,文件上传,fiter类等辅助类 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-web</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- 包括spring-mvc框架的所有类,包括国际化,标签,视图展现等相关的类,如果使用了独立的mvc框架,则无需这个jar文件里的任何类 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-webmvc</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- 包括spring-context的扩展支持,用于mvc -->
  	<!-- <dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context-support</artifactId>
  		<version>${spring.version}</version>
  	</dependency> -->
  	<!-- spring-aop包,提供aop的实现 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-aop</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- spring Ioc的基础实现,包含访问配置文件、创建和管理bean -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-beans</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- 在基础Ioc功能上提供扩展服务,还包含多种企业级服务的支持,controller、service、等 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- spring表达是语言 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-expression</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
    <!-- 为jdbc,hibernate,jdo,jpa提供一致声明式和编程式事务管理 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-tx</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<!-- spring对 object/xml映射的支持,可以让java于xml来回切换-->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-oxm</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
	<!-- 可以减少很多代码的重用 -->
  	<dependency>
  		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.16.16</version>
  	</dependency>
  	
  	
  	<!-- mybatis框架的工具包 -->
  	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.2</version>
	</dependency>


  	<dependency>
		<groupId>org.mybatis.generator</groupId>
  		<artifactId>mybatis-generator-core</artifactId>
  		<version>1.3.2</version>
	</dependency>

	<!-- spring 和 mybatis整合包 -->
  	<dependency>
		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis-spring</artifactId>
  		<version>1.3.1</version>
	</dependency>

	<!-- oracle -->
  	<dependency>
		<groupId>com.oracle.jdbc</groupId>
  		<artifactId>ojdbc7</artifactId>
  		<version>12.1.0.2.0</version>
	</dependency>

  	<dependency>
		<groupId>org.apache.commons</groupId>
  		<artifactId>commons-dbcp2</artifactId>
  		<version>2.1.1</version>
	</dependency>

	<!-- spring 连接jdbc的jar包 -->
  	<dependency>
		<groupId>org.springframework</groupId>
 	 	<artifactId>spring-jdbc</artifactId>
  		<version>${spring.version}</version>
	</dependency>
	
	<!-- aop必须包 -->
  	<!-- <dependency>
		<groupId>org.aspectj</groupId>
 		<artifactId>aspectjrt</artifactId>
  		<version>${spring.version}</version>
	</dependency> -->
	
	<!-- aop必须包 -->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.8.10</version>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>
	<dependency>
		<groupId>dom4j</groupId>
		<artifactId>dom4j</artifactId>
		<version>1.6.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
		<version>4.3.15.RELEASE</version>
	</dependency>
  </dependencies>
  
   <profiles>
  		<profile>
  			<id>jdk-1.8</id>
  			<activation>
  				<activeByDefault>true</activeByDefault>
  				<jdk>1.8</jdk>
  			</activation>
  			<properties>
  				<maven.compiler.source>1.8</maven.compiler.source>
  				<maven.compiler.target>1.8</maven.compiler.target>
  				<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  			</properties>
  		</profile>
  	</profiles>
  
  <build>
    <finalName>tzw-three</finalName>
  </build>
</project>

2.web.xml文件

搭建好maven库后,我们要发布服务,那么我们就会搭建一个web工程,而web工程最开始的就是web.xml了。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>tzw-three</display-name>


  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-application.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>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>
</web-app>

我们这里对比一下spring+spring mvc的web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd 
http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>tzw-web</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-application.xml</param-value>
  </context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>


  <servlet>
    
    <servlet-name>tzwServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:mvc/mvc-servlet.xml</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>tzwServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  

</web-app>

对比结果,其实我们发现,就是吧原来的DispatcherServlet换成了CXFServlet。其他的大致相同。

3.启动的配置文件

同理,cxf启动时也会加载spring配置。这里我加载了spring-application.xml文件。在这里用了import 标签,来加载其他的配置文件。

<?xml version="1.0" encoding="UTF-8"?>

<!-- 本文件作为Spring加载的配置文件,包含其他Spring配置文件,以避免修改web.xml。 -->

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jms="http://www.springframework.org/schema/jms"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
        
   <import resource="spring-ws.xml" /> 
	
        
</beans>

spring-ws.xml,在这个文件中才是真正的webservice配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd">
        
	<bean id="coreTransport" class="com.tzw.transport.CoreTransport"></bean>

	<jaxws:server id="IWTrans" serviceClass="com.tzw.transport.IWTransport" address="/coreTransport">
		<jaxws:serviceBean>
			<ref bean="coreTransport"></ref>		
		</jaxws:serviceBean>
	</jaxws:server>

</beans>

<jaxws:server>标签申明要发布的接口服务,以及访问地址

<jaxws:serviceBean> 一般是接口的实现。

4.发布的接口和实现

接口:IWTransport

package com.tzw.transport;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import com.tzw.transbean.Head;
import com.tzw.transbean.Message;

@WebService
public interface IWTransport {

	@WebMethod(action="process")
	@WebResult(name="response")
	public Message process(@WebParam(name="request")Message message);
	
}

实现:CoreTransport

package com.tzw.transport;

import com.tzw.transbean.Body;
import com.tzw.transbean.Head;
import com.tzw.transbean.Message;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;


@WebService
public class CoreTransport implements IWTransport{


	public Message process(Message message) {

		System.out.println("进入WebService服务");
		System.out.println(message.toString());
		Message response = new Message();
		Body body = new Body();

		body.setContent("收到报文");
		body.setMsgId("123456");
		response.setBody(body);
		return response;
	}

}

在这个接口中,实现的方法是process方法,该方法目前的参数是一个Message类,是一个复杂参数。当然,这个参数也可以是任何简单的参数类型(String int 等)。

既然webservice是将xml文件解析为对象使用,那么Message自然就是所谓的对象。

注解说明:

@WebService  这个是用来申明一个WebService服务的

@WebParam  声明一个WebService参数

@WebMethod 声明一个WebService方法

@WebResult 声明一个WebService 返回值

 

5. xml对应的对象

Message.java

package com.tzw.transbean;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
@XmlRootElement(name = "message")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message implements Serializable{

	@XmlElement(name = "body")
	private Body body;
	@XmlElement(name = "head")


	private Head head;
	public Body getBody() {
		return body;
	}
	public void setBody(Body body) {
		this.body = body;
	}
	public Head getHead() {
		return head;
	}
	public void setHead(Head head) {
		this.head = head;
	}
	@Override
	public String toString() {
		return "Message [body=" + body + ", head=" + head + "]";
	}
	
	
	
}

Head.java

package com.tzw.transbean;

import javax.xml.bind.annotation.*;
import java.io.Serializable;
@XmlRootElement(name = "head")
@XmlAccessorType(XmlAccessType.FIELD)
public class Head implements Serializable{



	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}
	@XmlElement(name = "username")
	public String username;
	@XmlElement(name = "password")
	public String password;
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "Head [username=" + username + ", password=" + password + "]";
	}
	
	
}

Body.java

package com.tzw.transbean;

import javax.xml.bind.annotation.*;
import java.io.Serializable;
@XmlRootElement(name = "head")
@XmlAccessorType(XmlAccessType.FIELD)
public class Head implements Serializable{



	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}
	@XmlElement(name = "username")
	public String username;
	@XmlElement(name = "password")
	public String password;
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "Head [username=" + username + ", password=" + password + "]";
	}
	
	
}

注解说明

@XmlRootElement  声明一个Xml文件的根元素

@mlAccessorType(XmlAccessType.FIELD) 

@XmlElement 声明一个Xml文件的根元素

 

6. 启动

将项目放入tomcat中启动。

 

 

 

在这里可以修改想要的参数,tomcat的名称,路径,jdk,端口号 

这里指定启动的项目,点击+ 可以添加

这说明一下 tzw-three:war 和 tzw-three:war exploded 

1.war模式这种可以称之为是发布模式,就是先将WEB工程打成war包,然后再将其上传到服务器进行发布 。;
2.war exploded模式是将WEB工程以当前文件夹的位置关系上传到服务器,即直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。

 

 

当tomcat启动成功之后

我们输入http://localhost:8080/tzw-three/ws这里为什么加/ws呢,别忘了,这是我们web.xml中配置的路径

如果展示上图则表示成功,接着我们点击 WSDL:.......,就会出现一下页面。当然直接输入http://localhost:8080/tzw-three/ws/coreTransport?wsdl也是可以的。

7. 模拟发送soap报文

接下来我们用soupUI模拟发送报文。

1.new soap project

 

2 创建,

3.生成

点击运行,收到响应报文。

JAXB(Java API for XML Binding)注解

@XmlRootElement   将一个Java类映射为一段XML的根节点
参数:name          定义这个根节点的名称
      namespace    定义这个根节点命名空间

@XmlAccessorType  定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:
      XmlAccessType.FIELD:映射这个类中的所有字段到XML
      XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
      XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
      XmlAccessType.NONE:不映射

@XmlElement  指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。
参数:defaultValue  指定节点默认值
         name             指定节点名称
         namespace    指定节点命名空间
         required         是否必须(默认为false)
         nillable           该字段是否包含 nillable="true" 属性(默认为false)
         type               定义该字段或属性的关联类型
————————————————
版权声明:本文为CSDN博主「jstkss」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zlgydx/article/details/51217359

 

 

这就完成cxf搭建webService并发布,接下来我们将进行优化等,还有拦截器等学习。

 

 

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值