CXF简单实例--MyEclipse, Junit, Maven--Xfire升级版,Web Service框架

服务接口:

package club.younge.demo;

import javax.jws.WebService;

//@WebService(name = "Hello", targetNamespace = "http://www.younge.club/demo", serviceName = "Hello")
//@WebService标签主要将类暴露为WebService,其中targetNamespace属性定义了自己的命名空间,
//serviceName则定义了< definitions >标签和<service>标签的name属性。
//@SOAPBinding(style = SOAPBinding.Style.RPC)
//@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT
@WebService
public interface ICxfService {
 public void add(Student student);
 public Student[] findStudents();
}

服务实现类:

package club.younge.demo;


import java.util.List;
import java.util.Vector;
import javax.jws.WebService;

//@WebService(name = "Hello", targetNamespace = "http://www.younge.club/demo", serviceName = "Hello", portName="HelloServicePort")
//@WebService标签主要将类暴露为WebService,其中targetNamespace属性定义了自己的命名空间,
//serviceName则定义了< definitions >标签和<service>标签的name属性。
//@SOAPBinding(style = SOAPBinding.Style.RPC)
//@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT
@WebService
public class CxfService implements ICxfService {

 static List<Student> repository= new Vector<Student>();

 public void add(Student student) {
  repository.add(student);
 }

 public Student[] findStudents() {
  Student[] users= new Student[repository.size()];
  repository.toArray(users);
  return users;
 }

}
实体类Student:
package club.younge.demo;

public class Student {
	private String number;
	private String name;
	public String getNumber() {
		return number;
	}
	public void setNumberAndName(String number, String name){
		this.number = number;
		this.name = name;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return new StringBuilder()
		.append("I am a student, my number is ")
		.append(this.number).append(",my name is ")
		.append(this.name).toString();
	}
	
}

Junit测试类:
package club.younge.demo;

import javax.xml.ws.Endpoint;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;

public class TestEndpoint {

	private static final String ADDRESS = "http://localhost:9000/hello";
	private static final String JETTY_DEPLOY_ADDRESS ="http://localhost:8080/demo/services/cxfService";

	@Test
	public void publish() throws Exception {

		System.out.println("Starting Server");
		CxfService demo = new CxfService();
		Endpoint.publish(ADDRESS, demo);
		System.out.println("Start success");
	}
	
	//Run as Java Application
	//http://localhost:9000/hello/CxfService?wsdl
	public static void main(String[] args) {
		System.out.println("Starting Server");
		CxfService demo = new CxfService();
		Endpoint.publish(ADDRESS, demo);
		System.out.println("Start success");
	}
	
	//编译时注释此段代码,因为编译时publish运行后即刻停止,测试会产生连接拒绝异常
	//请结合使用上面的main()测试无容器发布情况,双击方法Run as JUnit Test,运行时注意去掉@Test前面的双斜杠
	//@Test
	public void testClient() {

		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(ICxfService.class);
		factory.setAddress(ADDRESS);
		ICxfService client = (ICxfService) factory.create();
		Student student = new Student();
		student.setNumberAndName("11", "Younge");
		client.add(student);
		student.setNumberAndName("12", "Haha");
		client.add(student);
		Student[] students = client.findStudents();
		for (int i = 0, l = students.length; i < l; i++) {
			System.out.println(students[i]);
		}
	}
	
	//编译时注释此段代码,因为编译时Jetty容器还未启动,测试产生连接拒绝异常
	//容器启动后可以双击方法Run as JUnit Test ,运行时注意去掉@Test前面的双斜杠
	//@Test
	public void testJettyClient() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(ICxfService.class);
		factory.setAddress(JETTY_DEPLOY_ADDRESS);
		ICxfService client = (ICxfService) factory.create();
		Student student = new Student();
		student.setNumberAndName("11", "Youngee");
		client.add(student);
		student.setNumberAndName("12", "Hahaa");
		client.add(student);
		Student[] students = client.findStudents();
		for (int i = 0, l = students.length; i < l; i++) {
			System.out.println(students[i]);
		}
	}

}

web.xml中关键部分:
<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/cxf-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>/services/*</url-pattern>
	</servlet-mapping>
其中引用的cxf-beans中关键部分:
<jaxws:endpoint id="cxfService" implementor="club.younge.demo.CxfService" address="/cxfService" />
POM文件,主要配置javaee-web, jstl,spring,jetty:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>club.younge</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1</version>
	<packaging>war</packaging>
	<name>Hello</name>
	<description />
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.cxf/apache-cxf -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>apache-cxf</artifactId>
			<version>3.1.6</version>
			<type>pom</type>
		</dependency>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.1.7.RELEASE</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>1.9.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.1.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-oxm</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.1.7.RELEASE</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>opensymphony</groupId>
			<artifactId>sitemesh</artifactId>
			<version>2.3</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>4.1.7.RELEASE</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<version>3.1</version>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
确保没有错误后,首先编译源码,Run as Maven Build...在Goals里面输入:clean install,然后执行run,最后如果出现BUILD SUCCESS,则已经成功生成了WAR包。
下一步可以使用Jetty容器测试了,Run as Maven Build...在Goals里面输入:jetty:run,然后执行run,出现Started Jetty Server,并且没有报异常,则说明发布成功。
浏览器输入:http://localhost:8080/demo/services,注意其中的demo为war包去掉版本后的名称,即项目发布名称,在这个地方踩了一下坑,不过最后还是爬出了。

源码:

优快云下载源码

Github克隆下载源码


安卓端调用:http://blog.youkuaiyun.com/lyq8479/article/details/6428288/

主要要点:ksoap2框架,调用的命名空间、方法名称、EndPoint、SOAP Action、方法的入参等。

Spring CXF Hibernater整合时,注意在上下文XML中引入的文件CXF文件为CXF相关JAR包位置文件,2.4之前均需引入下图中的三个文件(cxf.xml在cxf-core.x.x.x.jar包中,cxf-extension-soap在cxf-rt-bindings-soap-2.x.x.jar中,cxf-servlet.xml在cxf-rt-transports-http-x.x.x.jar中),2.4之后仅需引入cxf-core-2.4.x.jar中classpath:META-INF/cxf/cxf.xml,详细参考http://cxf.apache.org/docs/embedding-cxf-inside-spring.html和http://blog.youkuaiyun.com/zt_fucker/article/details/50888545:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值