ทำไมต้องใช้ JAX-RS / Jersey?


85

ขออภัยคำถามนี้ฟังดูงี่เง่า แต่หลังจากพัฒนาบริการ RESTful โดยใช้ Jersey แล้วฉันก็ถามตัวเองว่า - ถ้า REST เป็นเพียงสถาปัตยกรรมไม่ใช่โปรโตคอลเช่น SOAP ทำไมเราต้องมีข้อกำหนดเช่น JAX-RS

จริงๆแล้วฉันใช้ Google สำหรับคำถามเช่น "ความแตกต่างระหว่าง servlets และบริการ RESTful บน HTTP" คืออะไรและเพื่อสรุปคำตอบของชุมชนฉันได้รับ:

  1. การพัฒนาบริการ RESTful (บนเจอร์ซีย์) เป็นสถาปัตยกรรมที่ใช้ servlets โดยธรรมชาติ
  2. เครื่องมือที่เข้ากันได้กับ JAX-RS เช่น Jersey ให้ข้อมูล XML / JSON แบบมาร์แชลลิ่งที่ง่ายช่วยให้นักพัฒนาซอฟต์แวร์
  3. REST ช่วยให้เราใช้ GET / POST / PUT / DELETE ในรูปแบบที่มีประสิทธิภาพสูงกว่า servlets ทั่วไป

ตามคำตอบเหล่านี้ฉันเดาว่าถ้าฉันเขียน servlet ที่ใช้ JAXB (สำหรับจัดการกับการทำให้เป็นอนุกรมอัตโนมัติ) และฉันใช้ GET / POST / PUT / DELETE อย่างมีประสิทธิภาพในรหัส servlet ของฉันฉันไม่ได้ใช้เครื่องมือเช่น Jersey และ ด้วยเหตุนี้ JAX-RS

ฉันรู้ว่าฉันผิดอย่างมากที่ส่งข้อความนี้มาโปรดแก้ไขฉันด้วย

PS: ข้อสงสัยนี้เกิดขึ้นจริงเมื่อฉันต้องพัฒนาบริการ RESTful ใน PHP หลังจากดำเนินการผ่านโค้ด RESTful PHP แล้วฉันก็รู้ว่ามันเป็นเพียงสคริปต์ PHP แบบเดิมพร้อมด้วยวิธีการช่วยเหลือบางอย่างในการจัดการ XML / JSON


ขอบคุณสำหรับการตอบกลับทั้งหมดของคุณ แต่มีใครตอบข้อแรกของฉันได้ไหม เหตุใดเราจึงต้องมีข้อกำหนดสำหรับ "สถาปัตยกรรม" ... อาจมีใครบางคนสามารถชี้ให้ฉันเห็นสถาปัตยกรรมอื่น ๆ ที่ให้ข้อมูลจำเพาะที่เป็นทางการก็ได้
WinOrWin

คุณกำลังมองหาเหตุผลมากกว่าความเรียบง่าย (โค้ดไม่กี่บรรทัด) และการพกพา (ปรับใช้กับ GlassFish, WebLogic, WebSphere, JBoss ฯลฯ ) หรือไม่ คุณสามารถพัฒนาบริการ RESTful โดยใช้ข้อกำหนดระดับล่างเช่น Servlets / JAXP / JDBC แต่โดยทั่วไปแล้วจะเกี่ยวข้องกับโค้ดมากกว่าข้อกำหนดระดับสูงเช่น JAX-RS / JAXB / JPA
bdoughan

คำตอบ:


72

ทำไมต้องใช้ JAX-RS / Jersey?

คำตอบสั้น ๆ

เนื่องจากทำให้การพัฒนาบริการ RESTful ง่ายขึ้น.

คำตอบยาว

JAX-RS เป็นมาตรฐานที่ทำให้ง่ายต่อการสร้างบริการ RESTful ที่สามารถปรับใช้กับเซิร์ฟเวอร์แอ็พพลิเคชัน Java ใด ๆ : GlassFish, WebLogic, WebSphere, JBoss และอื่น ๆ

JAX-RS เป็นส่วนหนึ่งของ Java EE และเมื่อใช้ JAX-RS ร่วมกับเทคโนโลยี Java EE อื่น ๆ การสร้างบริการ RESTful ของคุณจะง่ายยิ่งขึ้น:

  • EJB - เซสชั่นบีนใช้เป็นบริการและจัดการความหมายของธุรกรรม
  • JAX-RS - ใช้เพื่อแสดงเซสชั่นบีนเป็นบริการ RESTful
  • JPA - ใช้เพื่อคง POJO ไว้ในฐานข้อมูล สังเกตว่า EntityManager ถูกฉีดเข้าไปใน Session 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

58

REST เป็นสถาปัตยกรรมที่ใช้ servlets โดยธรรมชาติ

ไม่มันไม่ใช่. REST เป็นรูปแบบสถาปัตยกรรมที่สามารถนำไปใช้งานได้โดยใช้ servlets แต่ไม่ได้ใช้โดยเนื้อแท้และไม่มีส่วนเกี่ยวข้องใด ๆ กับ Java

JAX-RS เป็นข้อกำหนด JSR ที่กำหนด Java API สำหรับ RESTful Web Services

Jersey คือการนำ JAX-RS ไปใช้งานโดยเฉพาะ

ไม่ว่าจะใช้ Jersey หรือพยายามที่จะเป็นไปตามข้อกำหนด JAX-RS นั่นก็ขึ้นอยู่กับคุณ ถ้าทำให้งานของคุณง่ายขึ้นเยี่ยม! ถ้าไม่มีใครบังคับคุณ


12
+1 หมายเหตุเพิ่มเติม: การใช้ JAX-RS แทบจะรับประกันได้ว่าง่ายกว่าการใช้งาน ReSTful ของคุณเองโดยใช้ servlets นั่นคือจุดรวมของมัน
Ryan Stewart

@Ryan ดอน: นั่นคือจุดประสงค์ทั้งหมดของคำถามนี้ - เราต้องการเจอร์ซีย์เพียงเพื่อบรรเทากิจกรรมที่กล่าวถึงข้างต้นหรือไม่ และฉันรู้ว่า JAX-RS คืออะไรฉันแค่อยากรู้ว่าทำไมคน Java ถึงเสนอ API แยกสำหรับสิ่งนี้ ... PHP ไม่ได้เสนอใด ๆ และพวกเขาก็ยังทำได้ดีอยู่
WinOrWin

7
@WinOrWin: เราสามารถทำทุกอย่างในแอสเซมบลีได้เช่นกันทำไมต้องใช้ Java? ทั้งหมดที่ฉันพูดได้คือเขียน ReSTful API ทั้งสองวิธีและตัดสินใจว่าคุณต้องการทำอะไรซ้ำแล้วซ้ำอีก
Ryan Stewart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.