为什么要使用JAX-RS / Jersey?
对不起,这个问题听起来很愚蠢,但是在开发了一些使用Jersey的RESTful服务之后,我问自己这个问题 – 如果REST只是一个体系结构,而不是像SOAP这样的协议,为什么我们需要像JAX-RS这样的规范?
我实际上search了一些问题,例如“servlet和HTTP上的RESTful服务有什么区别”,并总结了社区的答案,我得到了:
- RESTful服务开发(在泽西岛上)是一种架构,它固有地使用servlet。
- 像Jersey这样的符合JAX-RS的工具提供了简单的编组 – parsingXML / JSON数据,帮助开发人员。
- 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规范,这就是你自己决定的。 如果它让你的工作更轻松,太棒了! 如果不是没有人强迫你。