使用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 {@ContextUriInfo uriInfo;@ContextRequest 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 {@ContextUriInfo uriInfo;@ContextRequest 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;}@DELETEpublic 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 dataProduct 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响应:

使用JSON和Jersey的Java RESTful Web服务相关推荐

  1. 使用Spring开发Java RESTful Web服务的7个理由

    REST现在已成为开发Web服务的标准方法,涉及Java时,可以使用许多框架和库,例如JAX-RS,Restlet,Jersey,RESTEasy,Apache CFX等,但是我鼓励Java开发人员使 ...

  2. 使用Java的RESTful Web服务

    REST代表"代表性状态转移",由Roy Fielding于2000年在其论文"建筑风格和基于网络的软件体系结构设计"中首次提出. REST是一种建筑风格. H ...

  3. RESTful Web 服务 - Java (JAX-RS)

    JAX-RS 表示用于 RESTful Web 服务的 Java API.JAX-RS 是一种基于 Java 的编程语言 API 以及为创建 RESTful Web 服务提供支持的规范.2.0 版本发 ...

  4. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

    http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/ 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务 Y ...

  5. Java RESTful Web Service实战(第2版) 2.3 传输格式

    2.3 传输格式 本节要考虑的就是如何设计表述,即传输过程中数据采用什么样的数据格式.通常,REST接口会以XML和JSON作为主要的传输格式,这两种格式数据的处理是本节的重点.那么Jersey是否还 ...

  6. jersey tomcat MySQL_基于jersey和Apache Tomcat构建Restful Web服务(一)

    基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  7. Java RESTful Web Service实战(第2版)

    Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著 图书在版编目(CIP)数据 Java RESTful Web Service实战 / 韩陆著. -2版 ...

  8. 带有Jersey的JAX-RS教程,用于RESTful Web服务

    在当今世界,数据扮演着非常重要的角色. 如此众多的应用程序将各种类型的数据用于不同的操作,所以最重要的方面是应用程序之间的通信. 当应用程序可以通信时,它们之间的数据共享变得容易. 就像在亚洲运行的应 ...

  9. Java RESTful Web Service实战

    编者按: InfoQ开设栏目"品味书香",精选技术书籍的精彩章节,以及分享看完书留下的思考和收获,欢迎大家关注.本文节选自韩陆著<Java RESTful Web Servi ...

  10. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

最新文章

  1. 基于CNN的图像缺陷分类
  2. java好还是python好-学python好还是java好
  3. SpringBoot Bean配置
  4. 路由(一)——路由原理及静态路由
  5. 绘制彩虹html代码,HTML5 Canvas 彩虹螺旋图生成器
  6. 主人的C++桌上也没有这么好看的花朵了
  7. 基础html交代选择器,html 选择器之基础选择器
  8. 解析Excel2007之关键点_Sheet.xml(一)
  9. 古文观止 —— 千古名篇
  10. 美国人太嚣张(爆笑呀!)
  11. paip.提升用户体验之全角半角
  12. 现浇板弹性计算还是塑性计算_双向板按弹性方法还是按塑性方法计算
  13. Xshell- Xftp评估过期处理方法
  14. SSD算法原理与代码(三)
  15. 微信小程序与后端Java接口交互-图书搜索实现
  16. android 蓝牙连接rtk,基于Android手机的RTK手簿软件设计与实现
  17. c0000005 Access Violation
  18. gurobi解的状态及其属性获取
  19. 一篇相当不错的js function详解 读了一定有收获
  20. 无秘借道“友秘”上架苹果商店

热门文章

  1. C++的Memcpy与Memcpy_s函数解析
  2. nexus的下载和安装
  3. DB2 查看表空间使用率
  4. 自动采集小说程序源码
  5. 大学python笔记整理_python 笔记整理
  6. javascript 读写服务器文件,js读写文件 - 爱coding的个人页面 - OSCHINA - 中文开源技术交流社区...
  7. 微信话术自动回复机器人软件
  8. 《银联提交服务单》-业务流程
  9. 【蓝牙】 HCI log分析工具----Frontline ComProbe Protocol Analysis System使用教程
  10. vc++/c++ 汉字取拼音首字母