为啥使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

Jersey 与 jax-rs 有啥区别

JAX-RS (Jersey 2) - 使用 JSR 250 注释的授权

如何使用JAX-RS和Jersey处理CORS

Jersey / JAX-RS ExceptionMapper MySQL

JAX-RS Jersey 读取内容类型为“*”的实体

JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构