为什么要使用JAX-RS / Jersey?

对不起,这个问题听起来很愚蠢,但是在开发了一些使用Jersey的RESTful服务之后,我问自己这个问题 – 如果REST只是一个体系结构,而不是像SOAP这样的协议,为什么我们需要像JAX-RS这样的规范?

我实际上search了一些问题,例如“servlet和HTTP上的RESTful服务有什么区别”,并总结了社区的答案,我得到了:

  1. RESTful服务开发(在泽西岛上)是一种架构,它固有地使用servlet。
  2. 像Jersey这样的符合JAX-RS的工具提供了简单的编组 – parsingXML / JSON数据,帮助开发人员。
  3. REST帮助我们使用GET / POST / PUT / DELETE,这种方式比普通的servlet有效得多。

根据这些答案,我猜如果我编写一个使用JAXB的servlet(用于处理自动序列化),并且在我的servlet代码中有效地使用GET / POST / PUT / DELETE,我不使用像Jersey这样的工具,因此JAX-RS。

我知道我通过这个声明是非常错误的,请纠正我。

PS:当我不得不在PHP中开发一些RESTful服务时,这个疑问实际上就出现了。 通过一些RESTful PHP代码后,我意识到它们只是旧的PHP脚本,有一些处理XML / JSON的辅助方法。

为什么要使用JAX-RS / Jersey?

简答

因为在使RESTful服务的开发更容易。

长答案

JAX-RS是一个标准,可以轻松创build可部署到任何Java应用程序服务器的RESTful服务:GlassFish,WebLogic,WebSphere,JBoss等。

JAX-RS是Java EE的一部分,当JAX-RS与其他Java EE技术一起使用时,创buildRESTful服务变得更加容易:

  • EJB – 会话bean被用作服务实现,也处理事务语义。
  • JAX-RS – 用于将会话Bean公开为RESTful服务
  • JPA – 用于将POJO持久化到数据库。 注意如何将EntityManager注入到会话bean中。
  • JAXB – 用于将POJO转换为XML(在GlassFish中,也可用于将POJO转换为JSON)。 JAX-RS默认处理与JAXB实现的交互。

样本JAX-RS服务

package org.example; import java.util.List; import javax.ejb.*; import javax.persistence.*; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; @Stateless @LocalBean @Path("/customers") public class CustomerService { @PersistenceContext(unitName="CustomerService", type=PersistenceContextType.TRANSACTION) EntityManager entityManager; @POST @Consumes(MediaType.APPLICATION_XML) public void create(Customer customer) { entityManager.persist(customer); } @GET @Produces(MediaType.APPLICATION_XML) @Path("{id}") public Customer read(@PathParam("id") long id) { return entityManager.find(Customer.class, id); } @PUT @Consumes(MediaType.APPLICATION_XML) public void update(Customer customer) { entityManager.merge(customer); } @DELETE @Path("{id}") public void delete(@PathParam("id") long id) { Customer customer = read(id); if(null != customer) { entityManager.remove(customer); } } @GET @Produces(MediaType.APPLICATION_XML) @Path("findCustomersByCity/{city}") public List<Customer> findCustomersByCity(@PathParam("city") String city) { Query query = entityManager.createNamedQuery("findCustomersByCity"); query.setParameter("city", city); return query.getResultList(); } } 

了解更多信息:

REST是一种内在使用servlet的体系结构。

不它不是。 REST是一种可以使用servlet实现的体系结构风格,但是本质上并不使用它们,也与Java本质上没有任何关系。

JAX-RS是为REST式Web服务定义Java API的JSR规范。

Jersey是JAX-RS的特定实现。

至于是否使用Jersey或试图遵从JAX-RS规范,这就是你自己决定的。 如果它让你的工作更轻松,太棒了! 如果不是没有人强迫你。