为什么使用JAX-RS / Jersey?


84

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

我实际上在Google上搜索了诸如“ servlet和HTTP上的RESTful服务之间的区别”之类的问题,并总结了社区的答案,我得到了:

  1. RESTful服务开发(在Jersey上)是一种体系结构,其固有地使用servlet。
  2. 诸如Jersey之类的与JAX-RS兼容的工具可以轻松地将XML / JSON数据编组/拆组,从而为开发人员提供了帮助。
  3. REST帮助我们以比普通servlet高效得多的方式使用GET / POST / PUT / DELETE。

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

我知道通过此声明我非常错误,请纠正我。

PS:当我不得不用PHP开发一些RESTful服务时,这种怀疑实际上就出现了。在研究了一些RESTful PHP代码之后,我意识到它们只是相同的旧PHP脚本,带有一些用于处理XML / JSON的辅助方法。


感谢你的回复。但是有人可以回答我的第一点吗?为什么我们需要一个“体系结构”的规范……也许有人可以将我指向提供正式规范的任何其他体系结构?
WinOrWin 2011年

您是否在寻找更多的原因,而不是简单性(几行代码)和可移植性(部署到GlassFish,WebLogic,WebSphere,JBoss等)?您可以使用较低级别的规范(例如Servlets / JAXP / JDBC)来开发RESTful服务,但是与较高级别的规范(例如JAX-RS / JAXB / JPA)相比,这通常涉及更多的代码。
bdoughan

Answers:


72

为什么使用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();
    }

}

想要查询更多的信息:


术语“会话Bean”在这里具有误导性。如您的代码所示,RESTful终结点应该是无状态的。没有保留会话。
phi

因此,根据您的询问,JAX-RS对XML更加友好,因为JSON转换仅可用于GlassFish服务器?谢谢
像素

谁能评论一下Springboot的不同之处?为什么要一个使用另一个?谢谢
像素

58

REST是一种体系结构,它固有地使用servlet。

不它不是。REST是一种体系结构样式,可以使用servlet来实现,但是不会固有地使用它们,也不会固有地与Java有关。

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

泽西岛是JAX-RS的特定实现。

至于是否使用Jersey还是要符合JAX-RS规范,这取决于您。如果它使您的工作更轻松,那就太好了!如果不是,没有人强迫你。


12
+1附加说明:与使用servlet滚动自己的ReSTful实现相比,使用JAX-RS几乎可以保证容易得多。这就是重点。
瑞安·斯图尔特

@Ryan,Don:这就是这个问题的全部目的-我们是否只需要泽西岛来缓解上述活动。我知道什么是JAX-RS,我只是想知道为什么Java人士为此提供了单独的API。
WinOrWin 2011年

7
@WinOrWin:我们也可以在汇编中完成所有操作,那么为什么要使用Java?我只能说是两种方式都编写了一个ReSTful API,并反复确定您要执行的操作。
瑞安·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.