cxf实现rest风格的webservice
开发环境:eclipse-jee-indigo-SR2-win32(3.7.2版本)、maven3.0.4、apache-tomcat-7.0.55、jdk1.7.0_67
开发技术:spring3.2.8、cxf2.7.12
项目截图:
项目编码:
一、pom.xml
<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>com.lessony.java</groupId>
<artifactId>CXFServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>CXFServer</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
<spring.version>3.2.8.RELEASE</spring.version>
<servlet-api.version>2.5</servlet-api.version>
<slf4j.version>1.7.5</slf4j.version>
<cxf.version>2.7.12</cxf.version>
<jackson.version>2.1.4</jackson.version>
</properties>
<dependencies>
<!-- spring begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring end -->
<!-- @Inject begin -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- @Inject end -->
<!-- servlet begin -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
</dependency>
<!-- servlet end -->
<!-- cxf begin -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<!-- cxf end -->
<!-- JSON begin -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.0</version>
</dependency>
<!-- JSON end -->
</dependencies>
<build>
<plugins>
<!-- compiler插件, 设定JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
二、spring配置文件applicationContext-server.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
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-3.0.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<context:component-scan base-package="com.lessony.java.service.impl" />
<import resource="classpath*:META-INF/cxf/cxf.xml" />
<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
<jaxrs:server id="restServiceContainer" address="/rest">
<jaxrs:providers>
<ref bean="jacksonProvider" />
</jaxrs:providers>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:serviceBeans>
<ref bean="userServiceImpl" />
</jaxrs:serviceBeans>
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxrs:outInterceptors>
</jaxrs:server>
<bean id="jacksonObjectMapper"
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"></bean>
<bean id="jacksonProvider"
class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
<property name="mapper" ref="jacksonObjectMapper" />
</bean>
</beans>
三、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>CXFServer</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-server.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>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、java代码
1、vo类(User.java、Users.java)
package com.lessony.java.vo;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "UserInfo")
public class User implements Serializable {
private static final long serialVersionUID = 677484458789332877L;
private int id;
private String name;
private String email;
private String address;
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", email=" + email
+ ", address=" + address + "]";
}
}
package com.lessony.java.vo;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "UserInfos")
public class Users {
private List<User> users;
private User[] userArr;
private Map<String, User> map;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public User[] getUserArr() {
return userArr;
}
public void setUserArr(User[] userArr) {
this.userArr = userArr;
}
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
}
package com.lessony.java.service;
import java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;
@Path("/user")
public interface IUserService {
@GET
@Path("/{id}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public User getUser(@PathParam("id") int id);
@GET
@Path("/array")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Users getArray();
@GET
@Path("/list")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Users getList();
@GET
@Path("/map")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Users getMap();
@POST
@Path("/add")
public User postData(User user) throws IOException;
@PUT
@Path("/update/{id}")
@Consumes(MediaType.APPLICATION_XML)
public User putData(@PathParam("id") int id, User user);
@DELETE
@Path("/delete/{id}")
public void deleteData(@PathParam("id") int id);
}
UserServiceImpl
):
package com.lessony.java.service.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Named;
import com.lessony.java.service.IUserService;
import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;
@Named
public class UserServiceImpl implements IUserService {
@Override
public User getUser(int id) {
User user = new User();
user.setId(id);
user.setName("JojO");
return user;
}
@Override
public Users getArray() {
User[] array = new User[5];
User user = null;
for (int i = 0; i < array.length;i ++) {
user = new User();
user.setId(i);
user.setName("arrayName-" + i);
array[i]=user;
}
Users users = new Users();
users.setUserArr(array);
return users;
}
@Override
public Users getList() {
List<User> list = new ArrayList<User>();
User user = null;
for (int i = 0; i < 4;i ++) {
user = new User();
user.setId(i);
user.setName("ListName-第" + i+ "个");
list.add(user);
}
Users users = new Users();
users.setUsers(list);
return users;
}
@Override
public Users getMap() {
Map<String, User> map = new HashMap<String, User>();
User user = null;
for (int i = 0; i < 4;i ++) {
user = new User();
user.setId(i);
user.setName("mapName" + i);
map.put("key-" + i, user);
}
Users users = new Users();
users.setMap(map);
return users;
}
@Override
public User postData(User user) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public User putData(int id, User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteData(int id) {
// TODO Auto-generated method stub
}
}
3、接口实现类(UserServiceImpl.java):
package com.lessony.java.service.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Named;
import com.lessony.java.service.IUserService;
import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;
@Named
public class UserServiceImpl implements IUserService {
@Override
public User getUser(int id) {
User user = new User();
user.setId(id);
user.setName("JojO");
return user;
}
@Override
public Users getArray() {
User[] array = new User[5];
User user = null;
for (int i = 0; i < array.length;i ++) {
user = new User();
user.setId(i);
user.setName("arrayName-" + i);
array[i]=user;
}
Users users = new Users();
users.setUserArr(array);
return users;
}
@Override
public Users getList() {
List<User> list = new ArrayList<User>();
User user = null;
for (int i = 0; i < 4;i ++) {
user = new User();
user.setId(i);
user.setName("ListName-第" + i+ "个");
list.add(user);
}
Users users = new Users();
users.setUsers(list);
return users;
}
@Override
public Users getMap() {
Map<String, User> map = new HashMap<String, User>();
User user = null;
for (int i = 0; i < 4;i ++) {
user = new User();
user.setId(i);
user.setName("mapName" + i);
map.put("key-" + i, user);
}
Users users = new Users();
users.setMap(map);
return users;
}
@Override
public User postData(User user) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public User putData(int id, User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteData(int id) {
// TODO Auto-generated method stub
}
}
代码全部完成。运行后,看到eclipse的内置浏览器显示下图:
新打开一个谷歌浏览器(不用ie的,ie的显示不出来json),在地址栏输入:http://localhost:8080/CXFServer/rest?_wadl
可以看到我们发布的webservice的接口描述文件(wadl描述):
在地址栏输入:http://localhost:8080/CXFServer/rest/user/123 (默认是xml格式)
或者http://localhost:8080/CXFServer/rest/user/123?_type=json (指明是返回json格式的数据)
再看一个list吧,输入:http://localhost:8080/CXFServer/rest/user/list
或者json格式显示:http://localhost:8080/CXFServer/rest/user/list?_type=json (中文有点编码问题,其实json是utf-8格式的,怎么设置自己解决吧)
完。
也许在练习过程中会遇到很多小问题,比如如何用maven新建web,如何把maven项目发布到tomcat等网上都有这方面的文章。这里不是重点就不涉及了。
源码下载地址:http://download.csdn.net/detail/lxn39830435731415926/7953147
作者:Java夜未眠
出处:https://www.cnblogs.com/liangxianning/p/17058287.html
版权声明:本博客所有文章除特别声明外,均采用「 MIT 许可协议。」许可协议进行许可
关于博主: 评论和私信会可能回复较慢,点击上面加人图标加我为好友吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)