Warum JAX-RS / Jersey verwenden?

83

Entschuldigung, diese Frage klingt albern, aber nachdem ich einige meiner RESTful-Services mit Jersey entwickelt hatte, stellte ich mir die Frage: Wenn REST nur eine Architektur und kein Protokoll wie SOAP ist, warum benötigen wir eine Spezifikation wie JAX-RS?

Ich habe tatsächlich nach Fragen wie "Was ist der Unterschied zwischen Servlets und RESTful-Diensten über HTTP" gegoogelt und um die Community-Antworten zusammenzufassen, habe ich Folgendes erhalten:

  1. RESTful Service Development (auf Jersey) ist eine Architektur, die von Natur aus Servlets verwendet.
  2. JAX-RS-kompatible Tools wie Jersey ermöglichen ein einfaches Marshalling-Unmarshalling von XML / JSON-Daten und helfen den Entwicklern.
  3. REST hilft uns, GET / POST / PUT / DELETE auf eine Weise zu verwenden, die weitaus effizienter ist als normale Servlets.

Nach diesen Antworten denke ich, wenn ich ein Servlet schreibe, das JAXB verwendet (für den Umgang mit automatischer Serialisierung), und GET / POST / PUT / DELETE effizient in meinem Servlet-Code verwende, verwende ich kein Tool wie Jersey und daher JAX-RS.

Ich weiß, dass ich furchtbar falsch liege, wenn ich diese Aussage übergebe. Bitte korrigieren Sie mich.

PS: Dieser Zweifel kam tatsächlich auf, als ich einige RESTful-Dienste in PHP entwickeln musste. Nachdem ich einige der RESTful-PHP-Codes durchgearbeitet hatte, stellte ich fest, dass es sich um dieselben alten PHP-Skripte handelt, mit einigen Hilfsmethoden für den Umgang mit XML / JSON.

WinOrWin
quelle
Vielen Dank für alle Ihre Antworten. Aber kann jemand einfach meinen ersten Punkt beantworten? Warum brauchen wir eine Spezifikation für eine "Architektur" ... vielleicht kann mich jemand einfach auf eine andere Architektur verweisen, die eine formale Spezifikation bietet?
WinOrWin
Suchen Sie mehr nach einem Grund als nach Einfachheit (wenige Codezeilen) und Portabilität (Bereitstellung in GlassFish, WebLogic, WebSphere, JBoss usw.)? Sie können einen RESTful-Service mithilfe von Spezifikationen niedrigerer Ebenen wie Servlets / JAXP / JDBC entwickeln. Dies umfasst jedoch im Allgemeinen mehr Code als Spezifikationen höherer Ebenen wie JAX-RS / JAXB / JPA.
Bdoughan

Antworten:

71

Warum JAX-RS / Jersey verwenden?

Kurze Antwort

Weil es die Entwicklung von RESTful-Services erleichtert.

Lange Antwort

JAX-RS ist ein Standard, mit dem auf einfache Weise ein RESTful-Service erstellt werden kann, der auf jedem Java-Anwendungsserver bereitgestellt werden kann: GlassFish, WebLogic, WebSphere, JBoss usw.

JAX-RS ist Teil von Java EE. Wenn JAX-RS mit anderen Java EE-Technologien verwendet wird, ist es noch einfacher, Ihren RESTful-Service zu erstellen:

  • EJB - Eine Session-Bean wird als Service-Implementierung verwendet und behandelt auch die Transaktionssemantik.
  • JAX-RS - Wird verwendet, um die Session Bean als RESTful-Service verfügbar zu machen
  • JPA - Wird verwendet, um die POJOs in der Datenbank zu speichern. Beachten Sie, wie der EntityManager in die Session-Bean eingefügt wird.
  • JAXB - Wird zum Konvertieren des POJO in / von XML verwendet (in GlassFish kann es auch zum Konvertieren des POJO in / von JSON verwendet werden). JAX-RS übernimmt standardmäßig die Interaktion mit der JAXB-Implementierung.

Beispiel für einen JAX-RS-Dienst

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();
    }

}

Für mehr Informationen:

bdoughan
quelle
Der Begriff "Session Bean" ist hier irreführend. Wie Ihr Code zeigt, soll der RESTful-Endpunkt zustandslos sein. Es wird keine Sitzung geführt.
Phi
JAX-RS ist also XML-freundlicher, basierend auf Ihrer Antwort, dass die JSON-Konvertierung nur mit dem GlassFish-Server verfügbar ist? Danke
Pixel
Könnte jemand den Unterschied zu Springboot kommentieren? Warum übereinander verwenden? Danke
Pixel
57

REST ist eine Architektur, die von Natur aus Servlets verwendet.

Nein ist es nicht. REST ist ein Architekturstil, der mithilfe von Servlets implementiert werden kann, diese jedoch weder inhärent verwendet noch inhärent mit Java zu tun hat.

JAX-RS ist eine JSR-Spezifikation, die eine Java-API für RESTful Web Services definiert.

Jersey ist eine spezielle Implementierung von JAX-RS.

Es liegt ganz bei Ihnen, ob Sie Jersey verwenden oder versuchen, die JAX-RS-Spezifikation einzuhalten. Wenn es Ihnen die Arbeit erleichtert, großartig! Wenn nicht, zwingt dich niemand.

Don Roby
quelle
12
+1 Zusätzlicher Hinweis: Die Verwendung von JAX-RS ist garantiert weitaus einfacher als die Ausführung Ihrer eigenen ReSTful-Implementierung mithilfe von Servlets. Das ist der springende Punkt.
Ryan Stewart
@ Ryan, Don: Das ist der gesamte Zweck dieser Frage - Brauchen wir Jersey nur, um die oben genannten Aktivitäten zu vereinfachen? Und ich weiß, was JAX-RS ist. Ich möchte nur wissen, warum Java-Leute eine separate API dafür anbieten ... PHP hat keine angeboten und es geht ihnen anscheinend immer noch gut.
WinOrWin
7
@ WinOrWin: Wir könnten auch alles in der Montage machen. Warum also Java verwenden? Ich kann nur sagen, dass Sie eine ReSTful-API in beide Richtungen schreiben und entscheiden, was Sie immer und immer wieder tun möchten.
Ryan Stewart