服务接口:
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包去掉版本后的名称,即项目发布名称,在这个地方踩了一下坑,不过最后还是爬出了。
源码:
安卓端调用: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: