使用 NetBean 7、Jersey 构建 REST 服务并返回 JSON 数据

红薯 发布于 2011/12/07 22:34
阅读 3K+
收藏 8

Jersey 最强的地方就是用来构建 REST 服务,本文将使用 NetBeans 内置的 Maven 支持来构建一个简单的 REST 服务,该服务返回 JSON 数据。

首先我们创建一个新的 Maven Web Application 名为 RestJson

你可以删除默认创建的 index.jsp 文件,然后右击 Dependencies 选择添加 jersey-server-linking 作为 jersey-json.

这里是完整的 POM 文件:

<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.giantflyingsaucer</groupId>
    <artifactId>RestJson</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
 
    <name>RestJson</name>
 
    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server-linking</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
 
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>6.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
 
</project>

接下来是创建一个扩展自 PackagesResourceConfig 的类,在本项目中我们无需 web.xml

创建一个新类名为 RestJsonApplication 包名是 com.giantflyingsaucer.restjson

RestJsonApplication.java 源码如下:

package com.giantflyingsaucer.restjson;
 
import com.sun.jersey.api.core.PackagesResourceConfig;
import javax.ws.rs.ApplicationPath;
 
@ApplicationPath("/")
public class RestJsonApplication extends PackagesResourceConfig {
 
    public RestJsonApplication() {
        super("com.giantflyingsaucer.restjson.v1.resources.impl");
    }
}

接下来我们再创建一个新类 Item 使用包名:com.giantflyingsaucer.restjson.v1.resources

v1 是什么呢?无所谓,只是便于识别的版本。

Item.java 源码如下:

package com.giantflyingsaucer.restjson.v1.resources;
 
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement
public class Item {
 
    private int id;
    private String name;
    private String description;
 
    public Item() {}
 
    public Item(int id, String name, String description) {
        this.id = id;
        this.name  = name;
        this.description = description;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    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;
    }
}

在同一个包下添加另外一个类 ItemResource

package com.giantflyingsaucer.restjson.v1.resources;
 
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
 
public interface ItemResource {
    // Example: Returning more than one Item
    @GET
    @Produces({MediaType.APPLICATION_JSON})
    List<Item> getItems();
}

这是服务定义接口。

接续创建一个接口的实现类 ItemResourceImpl ,包名是 com.giantflyingsaucer.restjson.v1.resources.impl

ItemResourceImpl.java 源码如下:

package com.giantflyingsaucer.restjson.v1.resources.impl;
 
import com.giantflyingsaucer.restjson.v1.resources.Item;
import com.giantflyingsaucer.restjson.v1.resources.ItemResource;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Path;
 
// Set the path, version 1 of API
@Path("/v1/item")
public class ItemResourceImpl implements ItemResource{
 
    @Override
    public List<Item> getItems() {
        List<Item> items = new ArrayList<Item>();
        items.add(new Item(100, "Widget", "A basic widget"));
        items.add(new Item(200, "SuperWidget", "A super widget"));
        items.add(new Item(300, "UberSuperWidget", "A uber super widget"));
 
        return items;
    }
}

为了简单,我们固定返回一些数值,并自动转换为 JSON 格式。

使用 Netbeans 7 内置对 Maven 的支持,执行 Clean and Build 操作(右击项目),然后发布 WAR 包到 Tomcat 7 中,因为需要 Servlet 3.0 的支持。

好了,试试访问:

http://localhost:8080/RestJson-1.0-SNAPSHOT/v1/item

得到的结果是

{ "item" : [ { "description" : "A basic widget",
         "id" : "100",
         "name" : "Widget"
       },
       { "description" : "A super widget",
         "id" : "200",
         "name" : "SuperWidget"
       },
       { "description" : "A uber super widget",
         "id" : "300",
         "name" : "UberSuperWidget"
       }
     ] }

 

你可以从这里获取整个项目的源码。

原文译自:http://www.giantflyingsaucer.com/blog/?p=3458

加载中
0
zouxingwei
zouxingwei
返回的json数据,怎么在前台获取?我用ajax一直获取不到,找不到原因,求解
0
北夜人
北夜人
ItemResource  这个接口的服务方法中如果包含有 @QueryParam注解的参数,这个接口该如何定义?
返回顶部
顶部