使用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
带有JSON示例的RESTful Web服务
在前面的教程中,我们看到了使用Jersey创建一个CRUD RESTful Web服务。 我们将根据该Web服务教程中提供的示例创建一个示例Web服务。 有多个依赖jar需要运行这个例子,它更好地使用MAVEN来管理JAR依赖。 通过我的Maven 10分钟教程,如果你是新的。
ProductsResource.java
此RESTful服务资源使用@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}),并且我们已经通过Maven添加了相关的JAR文件以生成JSON响应。 现在,如果这个Web服务接收到一个带有请求头Accept:application / json的请求,它将发出一个JSON响应。
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);}}我们需要向Web服务添加一个“Header”请求。
JSON响应:
XML响应:
总结
以上是生活随笔为你收集整理的使用JSON和Jersey的Java RESTful Web服务的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 有限状态机 Finite State M
- 下一篇: 原来Github上也有这么多的JavaS