为啥使用 JAX-RS / Jersey?
Posted
技术标签:
【中文标题】为啥使用 JAX-RS / Jersey?【英文标题】:Why use JAX-RS / Jersey?为什么使用 JAX-RS / Jersey? 【发布时间】:2011-10-26 11:59:43 【问题描述】:抱歉,这个问题听起来很傻,但是在使用 Jersey 开发了一些 RESTful 服务之后,我问自己一个问题——如果 REST 只是一种架构,而不是像 SOAP 这样的协议,为什么我们需要像 JAX 这样的规范-RS?
我实际上搜索了诸如“servlet 和 RESTful 服务通过 HTTP 有什么区别”之类的问题,并总结了社区的答案,我得到了:
-
RESTful 服务开发(在 Jersey 上)是一种架构,它本质上使用 servlet。
Jersey 等符合 JAX-RS 的工具可轻松编组和解组 XML/JSON 数据,从而帮助开发人员。
REST 帮助我们以一种比普通 servlet 高效得多的方式使用 GET/POST/PUT/DELETE。
根据这些答案,我想如果我编写一个使用 JAXB(用于处理自动序列化)的 servlet,并且我在我的 servlet 代码中有效地使用 GET/POST/PUT/DELETE,我不会使用像泽西岛,因此是 JAX-RS。
我知道我通过这个声明是非常错误的,请纠正我。
PS:当我不得不用 php 开发一些 RESTful 服务时,这个疑问实际上就出现了。在浏览了一些 RESTful PHP 代码之后,我意识到它们只是相同的旧 PHP 脚本,带有一些用于处理 XML/JSON 的辅助方法。
【问题讨论】:
感谢您的所有回复。但是有人可以回答我的第一点吗?为什么我们需要一个“架构”规范......也许有人可以指出我提供正式规范的任何其他架构? 您是否在寻找比简单性(几行代码)和可移植性(部署到 GlassFish、WebLogic、WebSphere、JBoss 等)更多的原因?您可以使用 Servlets/JAXP/JDBC 等较低级别的规范开发 RESTful 服务,但这通常比 JAX-RS/JAXB/JPA 等较高级别的规范涉及更多代码。 【参考方案1】:为什么使用 JAX-RS / Jersey?
简答
因为它使 RESTful 服务的开发变得更加容易。
长答案
JAX-RS 是一种标准,可以轻松创建可部署到任何 Java 应用服务器的 RESTful 服务:GlassFish、WebLogic、WebSphere、JBoss 等。
JAX-RS 是 Java EE 的一部分,当 JAX-RS 与其他 Java EE 技术一起使用时,创建 RESTful 服务变得更加容易:
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();
更多信息:
http://blog.bdoughan.com/2010/08/creating-restful-web-service-part-45.html【讨论】:
术语“会话 bean”在这里具有误导性。正如您的代码所示,RESTful 端点应该是无状态的。没有保留会话。 那么,JAX-RS 对 XML 更友好,因为您知道 JSON 转换仅适用于 GlassFish 服务器?谢谢 有人能评论一下与 Springboot 的区别吗?为什么要使用一个而不是另一个?谢谢【参考方案2】:REST 是一种架构,它本质上使用 servlet。
不,不是。 REST 是一种架构风格,可以使用 servlet 实现,但本身并不使用它们,也与 Java 没有任何关系。
JAX-RS 是一个 JSR 规范,为 RESTful Web 服务定义了一个 Java API。
Jersey 是 JAX-RS 的具体实现。
至于是使用 Jersey 还是尝试遵守 JAX-RS 规范,这取决于您。如果它使您的工作更轻松,那就太好了!如果不是没有人强迫你。
【讨论】:
+1 附加说明:几乎可以保证,使用 JAX-RS 比使用 servlet 滚动您自己的 ReSTful 实现要容易得多。这就是它的全部意义。 @Ryan, Don:这就是这个问题的全部目的——我们是否只需要 Jersey 来缓解上述活动。而且我知道 JAX-RS 是什么,我只想知道为什么 Java 人为此提供单独的 API……PHP 没有提供任何 API,但他们似乎仍然做得很好。 @WinOrWin:我们也可以在汇编中做任何事情,那么为什么要使用 Java?我只能说两种方式都写一个 ReSTful API,然后决定你想一遍又一遍地做哪一个。以上是关于为啥使用 JAX-RS / Jersey?的主要内容,如果未能解决你的问题,请参考以下文章
JAX-RS (Jersey 2) - 使用 JSR 250 注释的授权