web-dev-qa-db-ja.com

JAX-RS / Jerseyを使用する理由

申し訳ありませんが、この質問は愚かに聞こえますが、Jerseyを使用してRESTfulサービスの一部を開発した後、自分自身に質問しました-RESTが単なるアーキテクチャであり、SOAPのようなプロトコルではない場合、なぜJAX-RSのような仕様が必要ですか?

私は実際に「サーブレットとHTTPを介したRESTfulサービスとの違い」などの質問を探して、コミュニティの回答をまとめると、次のようになりました。

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

これらの回答によれば、JAXBを使用するサーブレットを作成し(自動シリアル化を処理するため)、サーブレットコードでGET/POST/PUT/DELETEを効率的に使用すると、ジャージーのようなツールを使用せず、したがって、JAX-RS。

私はこの声明を渡すのがひどく間違っていることを知っています、私を修正してください。

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

76
WinOrWin

JAX-RS/Jerseyを使用する理由

短い答え

RESTfulサービスの開発が容易になるためです。

ロングアンサー

JAX-RSは、任意のJavaアプリケーションサーバー:GlassFish、WebLogic、WebSphere、JBossなど)にデプロイできるRESTfulサービスを簡単に作成できる標準です。

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

}

詳細情報:

67
bdoughan

RESTは、本質的にサーブレットを使用するアーキテクチャです。

いいえそうではありません。 RESTはサーブレットを使用して実装できるアーキテクチャスタイルですが、本質的にはサーブレットを使用せず、本質的にJavaとは関係がありません。

JAX-RSは、RESTful Webサービス用のJava APIを定義するJSR仕様です。

Jerseyは、JAX-RSの特定の実装です。

Jerseyを使用するか、JAX-RS仕様に準拠しようとするかについては、あなた次第です。それがあなたの仕事をより簡単にしてくれるなら、素晴らしい!誰もあなたを強制していなければ。

53
Don Roby