目录
整合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并发布,接下来我们将进行优化等,还有拦截器等学习。