使用JSON和Jersey的Java RESTful Web服务

使用JSON和Jersey的Java RESTful Web服务

使用Jersey创建一个RESTful Web服务来产生JSON响应。 RESTful Web服务可以配置为生成不同类型的响应,如XML,JSON,html,纯文本和大多数MIME类型。 本篇文章完成设置mime类型以生成JSON响应。 如果你刚刚开始使用RESTful Web服务,可以先了解下Jersey的RESTful Web服务的基本信息。

@Produces Annotation

我们可以使用@Produces注释为资源指定MIME类型表示。 例如,我们可以将mime类型指定为text / html作为@Produces(“text / html”)。 此@Produces注释可以在类级别和方法级别指定。 方法默认为类级别注释,方法级别注释覆盖类级别注释的值。

@Produces({"application/xml", "application/json"})

当资源能够产生多个MIME类型时,则基于请求的Accept头选择类型。 accept头可以是以下格式的,例如,Accept: application/json接受标头可以指定多个MIME类型,在这种情况下,会考虑由接受标头指定的首选项。 如果首选项相等,则选择@Produces注释中的第一个出现MIME类型作为响应。

Web服务中的JSON响应

要更改已写入以提供XML响应或创建新响应的Web服务,我们只需要添加两件事。

使用@Produces注释并添加MIME类型应用程序/ json。
添加相关JAR文件以生成JSON响应。
SEVERE: MessageBodyWriter not found for media type={application/json, q=1000}, type=class java.util.ArrayList, genericType=java.util.List<com.javapapers.webservices.rest.jersey.Animal>.
如果您没有添加依赖的Jar文件以生成JSON响应,您将收到上述错误。 应该添加以下Maven依赖项来生成JSON

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.17</version>
</dependency>

带有JSON示例的RESTful Web服务

在前面的教程中,我们看到了使用Jersey创建一个CRUD RESTful Web服务。 我们将根据该Web服务教程中提供的示例创建一个示例Web服务。 有多个依赖jar需要运行这个例子,它更好地使用MAVEN来管理JAR依赖。 通过我的Maven 10分钟教程,如果你是新的。

  1. pom.xml和Maven依赖
<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>JSONRESTfulServices</groupId>
    <artifactId>JSONRESTfulServices</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.17</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.17</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.17</version>
        </dependency>

    </dependencies>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. Java RESTful Web服务与JSON示例源代码
    ProductsResource.java
    此RESTful服务资源使用@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}),并且我们已经通过Maven添加了相关的JAR文件以生成JSON响应。 现在,如果这个Web服务接收到一个带有请求头Accept:application / json的请求,它将发出一个JSON响应。
package com.javapapers.webservices.rest.jersey;

import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;

@Path("/products")
public class ProductsResource {

    @Context
    UriInfo uriInfo;

    @Context
    Request request;

    ProductService productService;

    public ProductsResource() {
        productService = new ProductService();
    }

    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public List<Product> getProducts() {
        return productService.getProductAsList();
    }

    @GET
    @Produces(MediaType.TEXT_XML)
    public List<Product> getProductsAsHtml() {
        return productService.getProductAsList();
    }

    // URI: /rest/products/count
    @GET
    @Path("count")
    @Produces(MediaType.TEXT_PLAIN)
    public String getCount() {
        return String.valueOf(productService.getProductsCount());
    }

    @POST
    @Produces(MediaType.TEXT_HTML)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void createProduct(@FormParam("id") String id,
            @FormParam("productname") String name,
            @FormParam("productcategory") String category,
            @Context HttpServletResponse servletResponse) throws IOException {
        Product product = new Product(id, name, category);
        productService.createProduct(product);
        servletResponse.sendRedirect("./products/");
    }

    @Path("{product}")
    public ProductResource getProduct(@PathParam("product") String id) {
        return new ProductResource(uriInfo, request, id);
    }

}

ProductService.java

package com.javapapers.webservices.rest.jersey;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBElement;

public class ProductResource {

    @Context
    UriInfo uriInfo;

    @Context
    Request request;
    String id;

    ProductService productService;

    public ProductResource(UriInfo uriInfo, Request request, String id) {
        this.uriInfo = uriInfo;
        this.request = request;
        this.id = id;
        productService = new ProductService();
    }

    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public Product getProduct() {
        Product product = productService.getProduct(id);
        return product;
    }

    @GET
    @Produces(MediaType.TEXT_XML)
    public Product getProductAsHtml() {
        Product product = productService.getProduct(id);
        return product;
    }

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public Response putProduct(JAXBElement<Product> productElement) {
        Product product = productElement.getValue();
        Response response;
        if (productService.getProducts().containsKey(product.getId())) {
            response = Response.noContent().build();
        } else {
            response = Response.created(uriInfo.getAbsolutePath()).build();
        }
        productService.createProduct(product);
        return response;
    }

    @DELETE
    public void deleteProduct() {
        productService.deleteProduct(id);
    }

}

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" 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>JSON RESTful Services</display-name>
 <servlet>
    <servlet-name>JSON RESTful Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.javapapers.webservices.rest.jersey</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JSON RESTful Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

其他文件

package com.javapapers.webservices.rest.jersey;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Product {
    private String id;
    private String name;
    private String category;

    public Product() {

    }

    public Product(String id, String name, String category) {
        super();
        this.id = id;
        this.name = name;
        this.category = category;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

}
package com.javapapers.webservices.rest.jersey;

import java.util.HashMap;
import java.util.Map;

public enum ProductDao {
    instance;

    private Map<String, Product> products = new HashMap<String, Product>();

    private ProductDao() {

        // pumping-in some default data
        Product product = new Product("1001", "iPhone 5S", "Mobile");
        products.put("1", product);

        product = new Product("1002", "Sony MDR-XD200", "Headphone");
        products.put("2", product);

        product = new Product("1003", "Bose Wave II", "Home Audio");
        products.put("3", product);
    }

    public Map<String, Product> getProducts() {
        return products;
    }

}
package com.javapapers.webservices.rest.jersey;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ProductService {

    ProductDao productDao;

    public ProductService() {
        productDao = ProductDao.instance;
    }

    public void createProduct(Product product) {
        productDao.getProducts().put(product.getId(), product);
    }

    public Product getProduct(String id) {
        return productDao.getProducts().get(id);
    }

    public Map<String, Product> getProducts() {
        return productDao.getProducts();
    }

    public List<Product> getProductAsList() {
        List<Product> productList = new ArrayList<Product>();
        productList.addAll(productDao.getProducts().values());
        return productList;
    }

    public int getProductsCount() {
        return productDao.getProducts().size();
    }

    public void deleteProduct(String id) {
        productDao.getProducts().remove(id);
    }

}
  1. RESTful Web服务客户端
    我们需要向Web服务添加一个“Header”请求。
    这里写图片描述

JSON响应:

这里写图片描述

XML响应:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值