Статьи

Создайте REST-сервис с Netbeans 7, Java и Jersey, который возвращает JSON

Одна из замечательных особенностей Джерси заключается в том, что он делает работу с REST действительно простой . Если вы новичок в Джерси и REST, вы можете проверить мою предыдущую статью, в которой показано, как легко создать простой сервис REST. Сегодня я собираюсь использовать Netbeans 7 (со встроенной поддержкой Maven) для создания еще одного простого сервиса REST, который может легко возвращать JSON (с помощью JAXB ).

С Netbeans 7 создайте новое веб-приложение Maven под названием: RestJson

Вы можете удалить файл index.jsp по умолчанию, который создается. Щелкните правой кнопкой мыши на Зависимости и добавьте 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»? Проще говоря, у меня есть это для управления версиями — это первая версия этого API.

Вот содержимое файла 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;
    }
}

Как вы можете видеть, это простой Java POJO с JAXB. В том же пакете добавьте еще один новый класс с именем: 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();
}

Это интерфейс сервиса, в котором мы определяем, что он будет делать. В этом случае он вернет объекты элемента в формате JSON.

Давайте создадим новый класс реализации, который теперь называется: ItemResourceImpl, который реализует интерфейс ItemResource . Пространство имен для нового класса: 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 выполняется для меня.

Используя поддержку Maven в Netbeans 7, выполните команду Clean and Build (щелкните правой кнопкой мыши по проекту) и разверните полученный WAR-файл на что-то вроде Tomcat 7 (я использую Tomcat 7, но не стесняйтесь использовать то, что вы хотите, пока он поддерживает Servlet 3.0, так как мы не используем файл web.xml для этого проекта). Как только Tomcat будет извлечен и развернут WARC, перейдите по URL, и вы увидите возвращение JSON.

HTTP: // локальный: 8080 / RestJson-1,0-ПАНОРАМА / v1 / шт

Полученные результаты:

{ "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"
      }
    ] }