Навіщо використовувати JAX-RS / Джерсі?


84

На жаль, ці запитання звучать безглуздо, але після розробки деяких моїх RESTful сервісів за допомогою Джерсі я задав собі питання - якщо REST - це просто архітектура, а не протокол, як SOAP, навіщо нам потрібна специфікація, така як JAX-RS?

Я насправді гуглив запитання на кшталт "Яка різниця між сервлетами та RESTful-сервісами через HTTP", і, підбиваючи відповіді спільноти, я отримав:

  1. Розробка сервісу RESTful (на Джерсі) - це архітектура, яка за своєю суттю використовує сервлети.
  2. Інструменти, сумісні з JAX-RS, такі як Jersey, забезпечують легке маршірування-демаршалінг даних XML / JSON, допомагаючи розробникам.
  3. REST допомагає нам використовувати GET / POST / PUT / DELETE способом, який є набагато ефективнішим, ніж звичайні сервлети.

Відповідно до цих відповідей, я думаю, якщо я пишу сервлет, який використовує JAXB (для роботи з автоматичною серіалізацією), і я ефективно використовую GET / POST / PUT / DELETE у своєму коді сервлета, я не використовую такий інструмент, як Джерсі, і звідси JAX-RS.

Я знаю, що страшенно помиляюся, передаючи це твердження, будь ласка, виправте мене.

PS: Цей сумнів насправді виник, коли мені довелося розробити деякі послуги RESTful в PHP. Після перегляду деяких RESTful PHP-кодів, я зрозумів, що це ті самі старі PHP-скрипти, з деякими допоміжними методами для обробки XML / JSON.


Дякую за всі ваші відповіді. Але чи може хтось просто відповісти на мою першу думку? Навіщо нам потрібна специфікація для "архітектури" ... можливо, хтось може просто вказати мені на будь-яку іншу архітектуру, яка забезпечує офіційну специфікацію?
WinOrWін

Ви шукаєте більше причин, ніж простота (кілька рядків коду) та портативність (розгортання до GlassFish, WebLogic, WebSphere, JBoss тощо)? Ви можете розробити послугу RESTful, використовуючи специфікації нижчого рівня, такі як Servlets / JAXP / JDBC, але це, як правило, включає більше коду, ніж специфікації вищого рівня, такі як JAX-RS / JAXB / JPA.
bdoughan

Відповіді:


72

Навіщо використовувати JAX-RS / Джерсі?

Коротка відповідь

Тому що це полегшує розробку 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 вводиться в сеансовий компонент.
  • 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();
    }

}

Для отримання додаткової інформації:


Термін "сеансова квасоля" тут вводить в оману. Як показує ваш код, кінцева точка RESTful повинна бути без громадянства. Сеанс не проводиться.
фі

Отже, JAX-RS є більш зручним для XML, виходячи з вашого твердження, що перетворення JSON доступне лише на сервері GlassFish? Дякую
піксель

Хтось може прокоментувати різницю з Springboot? Навіщо використовувати одне над іншим? Дякую
піксель

58

REST - це архітектура, яка за своєю суттю використовує сервлети.

Ні, це не так. REST - це архітектурний стиль, який можна реалізувати за допомогою сервлетів, але за своєю суттю не використовує їх і не має нічого спільного з Java.

JAX-RS - це специфікація JSR, що визначає API Java для веб-служб RESTful.

Джерсі - це специфічна реалізація JAX-RS.

Щодо того, використовувати Джерсі чи намагатись відповідати вимогам JAX-RS, це все залежить від вас. Якщо це полегшує вам роботу, чудово! Якщо ні, то вас ніхто не примушує.


12
+1 Додаткова примітка: використання JAX-RS майже гарантовано буде набагато простішим, ніж прокатка власної реалізації ReSTful за допомогою сервлетів. У цьому вся суть.
Райан Стюарт,

@Ryan, Don: Ось і вся мета цього питання - чи потрібен нам Джерсі лише для полегшення вищезазначених заходів. І я знаю, що таке JAX-RS, я просто хочу знати, чому люди Java пропонують окремий API для цього ... PHP не пропонував жодного, і все ще здається, це добре.
WinOrWін

7
@WinOrWin: Ми теж могли робити все в збірці, так навіщо використовувати Java? Все, що я можу сказати, це написати ReSTful API в обидві сторони і вирішити, що ви хочете робити знову і знову.
Ryan Stewart
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.