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

88
抱歉,这个问题听起来有点愚蠢,但在使用Jersey开发了一些RESTful服务之后,我问自己一个问题——如果REST只是一种架构,并不像SOAP一样是一个协议,那么我们为什么需要像JAX-RS这样的规范呢?
实际上,我搜索了一些类似"Servlet与RESTful服务在HTTP上的区别是什么"的问题,并总结了社区的答案,得出以下结论:
1. RESTful服务开发(使用Jersey)是一种架构,它本质上使用servlets。
2. JAX-RS兼容的工具(如Jersey)提供了XML / 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的辅助方法。

谢谢大家的回复。但是,有人可以回答我的第一个问题吗?为什么我们需要一个“架构”的规范...也许有人可以指向任何其他提供正式规范的架构? - WinOrWin
你是否想要更多的理由来选择简洁性(少量代码行数)和可移植性(能够部署到GlassFish、WebLogic、WebSphere、JBoss等)?你可以使用较低级别的规范,比如Servlets/JAXP/JDBC来开发RESTful服务,但通常会涉及更多的代码,而较高级别的规范,如JAX-RS/JAXB/JPA则相对简洁。 - bdoughan
2个回答

74
为什么要使用JAX-RS / Jersey?
简要回答:因为它使得开发RESTful服务更加容易。
详细回答:JAX-RS 是一个标准,使得创建可部署到任何Java应用服务器(GlassFish、WebLogic、WebSphere、JBoss等)的 RESTful 服务变得更加容易。它是 Java EE 的一部分,当与其他 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();
    }

}

更多信息:


“Session bean”这个术语在这里是具有误导性的。正如您的代码所示,RESTful端点应该是无状态的。没有保留任何会话信息。 - phi
那么,根据您的回答,JAX-RS更加友好于XML,因为JSON转换仅在GlassFish服务器上可用?谢谢。 - pixel
有人能评论一下Springboot的区别吗?为什么要选择其中之一?谢谢。 - pixel
基于个人经验:是的,相比Servlets,JAX-RS是一个小但显著的净积极和可维护的选择;JPA则是一个巨大的负面因素,难以维护;至于EJB,我不想谈论,因为骂人是不被鼓励的;而JAXB则取决于你喜欢多少调试神奇注释,可能会带来一些好处。 :D - tekHedd

62

REST是一种体系结构,可以使用servlet进行实现。

不是的。REST是一种架构风格,可以使用servlet进行实现,但并不固有使用它们,也并不与Java有任何必然联系。

JAX-RS是一个JSR规范,定义了用于RESTful Web服务的Java API。

Jersey是JAX-RS的一个具体实现。

至于是否使用Jersey或试图符合JAX-RS规范,这取决于你自己的需要。如果能使您的工作更加轻松便利,那太好了!如果不需要,也没有人强迫你。


12
额外说明:使用JAX-RS几乎可以保证比使用servlet自己实现ReSTful要容易得多。这就是它的全部意义。 - Ryan Stewart
1
@Ryan, Don:这个问题的整个目的就是 - 我们是否只需要Jersey来简化上述活动。我知道什么是JAX-RS,我只想知道为什么Java人员为此提供了单独的API...PHP没有提供任何API,但似乎他们做得很好。 - WinOrWin
8
我们也可以全部使用汇编语言完成,那为什么要使用Java呢?我只能说两种方式都写一个ReSTful API,然后决定你想一遍又一遍地做哪一个。 - Ryan Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接