說明:本筆記是在學(xué)習(xí)《Java RESTful Web Service實戰(zhàn)》一書的筆記
一、項目結(jié)構(gòu)如下圖
二、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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.airkisser</groupId>
<artifactId>simple-service</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-service</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
</dependency>
<!-- uncomment this to get JSON support:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<inherited>true</inherited>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.airkisser.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<jersey.version>2.9</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
三航邢、代碼分析
Main.java(程序入口)
package com.airkisser;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.io.IOException;
import java.net.URI;
public class Main {
// Base URI the Grizzly HTTP server will listen on
public static final String BASE_URI = "http://localhost:8080/simple-service/";
/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
*/
public static HttpServer startServer() {
// 配置掃描包
final ResourceConfig rc = new ResourceConfig().packages("com.airkisser.api");
// create and start a new instance of grizzly http server
// exposing the Jersey application at BASE_URI
return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
/**
* Main method.
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
final HttpServer server = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
System.in.read();
server.shutdownNow();
}
}
DeviceResource.java(資源)
package com.airkisser.api;
import com.airkisser.dao.DeviceDao;
import com.airkisser.entity.Device;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("device")
public class DeviceResource {
private final DeviceDao deviceDao;
// 注入Dao
public DeviceResource() {
this.deviceDao = new DeviceDao();
}
@GET
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Device get(@QueryParam("ip") final String deviceIp){
Device result = null;
if(deviceIp != null){
result = deviceDao.getDevice(deviceIp);
}
return result;
}
@PUT
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Device put(final Device device){
Device result = null;
if(device != null) {
result = deviceDao.updateDevice(device);
}
return result;
}
}
DeviceDao.java(模擬的Dao)
package com.airkisser.dao;
import com.airkisser.entity.Device;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DeviceDao {
private ConcurrentMap<String, Device> fakeDB = new ConcurrentHashMap<>();
public DeviceDao() {
fakeDB.put("10.11.58.163", new Device("10.11.58.163"));
fakeDB.put("10.11.58.185", new Device("10.11.58.185"));
}
public Device getDevice(String deviceIp) {
return fakeDB.get(deviceIp);
}
public Device updateDevice(Device device) {
String ip = device.getDeviceIp();
if (ip != null && fakeDB.containsKey(ip)) {
fakeDB.put(ip, device);
}
return fakeDB.get(ip);
}
}
Device.java
package com.airkisser.entity;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "device")
public class Device {
private String deviceIp;
private int deviceStatus;
public Device() {
}
public Device(String deviceIp) {
this.deviceIp = deviceIp;
}
// @XmlAttribute只能注解在get方法上载萌,不能直接注解到屬性上
@XmlAttribute
public String getDeviceIp() {
return deviceIp;
}
public void setDeviceIp(String deviceIp) {
this.deviceIp = deviceIp;
}
@XmlAttribute
public int getDeviceStatus() {
return deviceStatus;
}
public void setDeviceStatus(int deviceStatus) {
this.deviceStatus = deviceStatus;
}
}
四、測試
ResourceTest.java
package com.airkisser;
import com.airkisser.entity.Device;
import org.glassfish.grizzly.http.server.HttpServer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import static org.junit.Assert.assertEquals;
public class ResourceTest {
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
// start the server
server = Main.startServer();
// create the client
Client c = ClientBuilder.newClient();
// uncomment the following line if you want to enable
// support for JSON in the client (you also have to uncomment
// dependency on jersey-media-json module in pom.xml and Main.startServer())
// --
// c.configuration().enable(new org.glassfish.jersey.media.json.JsonJaxbFeature());
target = c.target(Main.BASE_URI);
}
@After
public void tearDown() throws Exception {
server.shutdownNow();
}
@Test
public void testGetDevice() {
final String testIp = "10.11.58.185";
final Device device = target.path("device").queryParam("ip", testIp).request().get(Device.class);
assertEquals(testIp, device.getDeviceIp());
}
@Test
public void testPutDevice() {
final String testIp = "10.11.58.185";
final Device device = new Device(testIp);
device.setDeviceStatus(1);
Entity<Device> entity = Entity.entity(device, MediaType.APPLICATION_XML_TYPE);
final Device result = target.path("device").request().put(entity, Device.class);
assertEquals(1, result.getDeviceStatus());
}
}
SoapUI工具測試
device資源的get方法測試
device資源的put方法測試
備注
啟動程序后宋税,輸入http://localhost:8080/simple-service/application.wadl
可查看WADL內(nèi)容
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.9 2014-05-22 05:12:10"/>
<doc xmlns:jersey="http://jersey.java.net/"
jersey:hint="This is simplified WADL with user and core resources only. To get full WADL with extended resources use the query parameter detail. Link: http://localhost:8080/simple-service/application.wadl?detail=true"/>
<grammars>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>
<resources base="http://localhost:8080/simple-service/">
<resource path="device">
<method id="put" name="PUT">
<response>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" xmlns="" element="device"
mediaType="application/json"/>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" xmlns="" element="device"
mediaType="application/xml"/>
</response>
</method>
<method id="get" name="GET">
<request>
<param xmlns:xs="http://www.w3.org/2001/XMLSchema" name="ip" style="query" type="xs:string"/>
</request>
<response>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" xmlns="" element="device"
mediaType="application/json"/>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" xmlns="" element="device"
mediaType="application/xml"/>
</response>
</method>
</resource>
</resources>
</application>