一.服務端
新建項目:spring-jax-rs-server
1.pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>web-service-demo</artifactId>
<groupId>com.meboth.bonc.ljf</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.meboth.bonc.ljf.spring.jax.rs.server</groupId>
<artifactId>spring-jax-rs-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-jax-rs-server Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- cxf 進行rs開發 必須導入 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日誌引入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 客戶端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 擴展json提供者 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 轉換json工具包,被extension providers 依賴 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
<!-- spring 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring web集成 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring 整合junit -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- junit 開發包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>spring-jax-rs-server</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- maven的jdk編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!-- 運行tomcat7方法:tomcat7:run -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 請求路徑 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.實體類
package com.ljf.spring.jax.rs.server.model;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
@XmlRootElement(name = "myBeiJingUser")
public class BeiJingUser {
private int id;
private String name;
private String address;
private List<Mobile> mobileList=new ArrayList<Mobile>();
public BeiJingUser() {
}
public BeiJingUser(int id, String name, String address, List<Mobile> mobileList) {
this.id = id;
this.name = name;
this.address = address;
this.mobileList = mobileList;
}
public BeiJingUser(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = 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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Mobile> getMobileList() {
return mobileList;
}
public void setMobileList(List<Mobile> mobileList) {
this.mobileList = mobileList;
}
}
package com.ljf.spring.jax.rs.server.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "myCellPhone")
public class Mobile {
private int id;
private String name;
public Mobile() {
}
public Mobile(int id, String name) {
this.id = id;
this.name = name;
}
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;
}
}
3.接口和實現類:
package com.ljf.spring.jax.rs.server.service;
import com.ljf.spring.jax.rs.server.model.BeiJingUser;
import javax.ws.rs.*;
import java.util.List;
@Path("/bjService") // 路徑;訪問當前服務接口時候的路徑。
@Produces("*/*")
public interface UserService {
@POST
@Path("/bjUser") // 路徑; 訪問當前服務接口的方法路徑
// @Consumes 服務端支持的請求的數據格式(xml、json)
@Consumes({ "application/xml", "application/json" })
public void saveUser(BeiJingUser user);
@PUT
@Path("/bjUser")
@Consumes({ "application/xml", "application/json" })
public void updateUser(BeiJingUser user);
@GET
@Path("/bjUser")
// @Produces 服務端支持的響應的數據格式
@Produces({ "application/xml", "application/json" })
public List<BeiJingUser> findAllUsers();
@GET
@Path("/bjUser/{id}")
@Consumes("application/xml")
@Produces({ "application/xml", "application/json" })
public BeiJingUser finUserById(@PathParam("id") Integer id);
@DELETE
@Path("/bjUser/{id}")
@Consumes({"application/xml", "application/json"})
public void deleteUser(@PathParam("id") Integer id);
}
package com.ljf.spring.jax.rs.server.service;
import com.ljf.spring.jax.rs.server.model.Mobile;
import com.ljf.spring.jax.rs.server.model.BeiJingUser;
import java.util.ArrayList;
import java.util.List;
public class UserServiceImpl implements UserService{
public void saveUser(BeiJingUser user) {
System.out.println("save user:" + user.getName());
}
public void updateUser(BeiJingUser user) {
System.out.println("update user:" + user);
}
public List<BeiJingUser> findAllUsers() {
List<BeiJingUser> users = new ArrayList<BeiJingUser>();
// 汽車
List<Mobile> carList1 = new ArrayList<Mobile>();
Mobile car1 = new Mobile(101,"apple");
Mobile car2 = new Mobile(102,"huawei");
carList1.add(car1);
carList1.add(car2);
// 用戶
BeiJingUser user1 = new BeiJingUser(1,"小明","海淀",carList1);
BeiJingUser user2 = new BeiJingUser(2,"小麗","朝陽",carList1);
// 用戶集合
users.add(user1);
users.add(user2);
return users;
}
public BeiJingUser finUserById(Integer id) {
if (id == 1) {
Mobile bike= new Mobile(101,"xiaomi");
List<Mobile> bList= new ArrayList<Mobile>();
bList.add(bike);
return new BeiJingUser(1,"小明","大興",bList);
}
return null;
}
public void deleteUser(Integer id) {
System.out.println("delete user id :" + id);
}
}
4.資源類:
applicationContext類:
<?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:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
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://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
">
<!--
Spring整合ApacheCXF,發佈jaxws服務:
1. 服務地址
2. 服務bean
完整服務地址:
http://localhost:8080/ws/userService
-->
<jaxrs:server address="/mlgbUser">
<jaxrs:serviceBeans>
<bean class="com.ljf.spring.jax.rs.server.service.UserServiceImpl"></bean>
</jaxrs:serviceBeans>
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxrs:outInterceptors>
</jaxrs:server>
</beans>
log4j類:
log4j.rootLogger=INFO,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}[%5p]-%c(%L)-%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=./web-service.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}[%5p]-%c(%L)-%m%n
log4j.appender.FILE.MaxFileSize=30MB
5.web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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>
<!-- 1. 配置springioc容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
6.發佈服務:
配置後,啓動就ok了!
二.客戶端
新建項目:spring-jax-rs-client
1.pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>web-service-demo</artifactId>
<groupId>com.meboth.bonc.ljf</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.meboth.bonc.ljf.spring.jax.rs.client</groupId>
<artifactId>spring-jax-rs-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-jax-rs-client Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- cxf 進行rs開發 必須導入 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日誌引入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 客戶端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 擴展json提供者 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 轉換json工具包,被extension providers 依賴 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
<!-- spring 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring web集成 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring 整合junit -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- junit 開發包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>spring-jax-rs-client</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- maven的jdk編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!-- 運行tomcat7方法:tomcat7:run -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 請求路徑 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.實體類:
package com.ljf.spring.jax.rs.client.model;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
@XmlRootElement(name = "myBeiJingUser")
public class BeiJingUser {
private int id;
private String name;
private String address;
private List<Mobile> mobileList=new ArrayList<Mobile>();
public BeiJingUser() {
}
public BeiJingUser(int id, String name, String address, List<Mobile> mobileList) {
this.id = id;
this.name = name;
this.address = address;
this.mobileList = mobileList;
}
public BeiJingUser(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = 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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Mobile> getMobileList() {
return mobileList;
}
public void setMobileList(List<Mobile> mobileList) {
this.mobileList = mobileList;
}
}
package com.ljf.spring.jax.rs.client.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "myCellPhone")
public class Mobile {
private int id;
private String name;
public Mobile() {
}
public Mobile(int id, String name) {
this.id = id;
this.name = name;
}
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;
}
}
3.資源類:
log4j.rootLogger=INFO,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}[%5p]-%c(%L)-%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=./web-service.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}[%5p]-%c(%L)-%m%n
log4j.appender.FILE.MaxFileSize=30MB
4.調用類:
http://localhost:8080/ws/mlgbUser/bjService/bjUser 注意路徑又多了一層
package com.ljf.spring.jax.rs.client;
import com.ljf.spring.jax.rs.client.model.BeiJingUser;
import org.apache.cxf.jaxrs.client.WebClient;
import javax.ws.rs.core.MediaType;
import java.util.Collection;
public class JaxRsClient {
public static void main(String args[])throws Exception{
findAll();
save();
}
public static void save() {
// 測試1: 保存
WebClient
.create("http://localhost:8080/ws/mlgbUser/bjService/bjUser")
.post(new BeiJingUser(100,"tongzhou","tongzhou"));
}
public static void delete(){
// 測試2:刪除(傳入id)
WebClient
.create("http://localhost:8080/ws/mlgbUser/bjService/bjUser/100")
.delete();
}
/**
* 查詢全部
* @throws Exception
*/
public static void findAll() throws Exception {
Collection<? extends BeiJingUser> collection =
WebClient
.create("http://localhost:8080/ws/mlgbUser/bjService/bjUser")
.accept(MediaType.APPLICATION_JSON)
.getCollection(BeiJingUser.class);
System.out.println(collection);
}
}
5.啓動訪問: