1. ホーム
  2. rest

[解決済み] なぜJAX-RS / Jerseyを使うのか?

2023-05-14 05:04:44

質問

もしRESTが単なるアーキテクチャであり、SOAPのようなプロトコルでないなら、なぜJAX-RSのような仕様が必要なのでしょうか?

私は実際に "サーブレットとHTTP上のRESTfulサービスの違いは何ですか"のような質問をググって、コミュニティの回答を要約すると、私は得ました。

  1. RESTful サービス開発 (Jersey) はアーキテクチャであり、本質的にサーブレットを使用します。
  2. JerseyのようなJAX-RS準拠のツールは、XML/JSONデータの容易なマーシャル-アンマーシャルを提供し、開発者を支援します。
  3. RESTは、通常のサーブレットよりもはるかに効率的な方法でGET/POST/PUT/DELETEを使用することを支援します。

これらの回答によると、もし私がJAXB(自動シリアライズに対処するため)を使用するサーブレットを書き、サーブレットコードでGET/POST/PUT/DELETEを効率的に使用するなら、Jersey、つまりJAX-RSといったツールは使わないということでしょうか。

私はこのステートメントを通過するのがひどく間違っていることを知っています、訂正してください。

PS: この疑問は、実際に私がPHPでいくつかのRESTfulサービスを開発しなければならなかったときに生じました。RESTful な PHP コードをいくつか試した後、それらは、XML/JSON を処理するためのいくつかのヘルパー メソッドを備えた、単なる古い PHP スクリプトであることに気づきました。

どのように解決するのですか?

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

}

詳細はこちら。