なぜJAX-RS / Jerseyを使用するのですか?


84

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

私は実際に「HTTPを介したサーブレットとRESTfulサービスの違いは何ですか」などの質問をグーグルで検索し、コミュニティの回答を要約すると、次のようになりました。

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

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

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

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


返信ありがとうございます。しかし、誰かが私の最初のポイントに答えることができますか?なぜ「アーキテクチャ」の仕様が必要なのですか...誰かが私に正式な仕様を提供する他のアーキテクチャを教えてくれるかもしれません。
WinOrWin 2011

単純さ(数行のコード)と移植性(GlassFish、WebLogic、WebSphere、JBossなどへのデプロイ)よりも多くの理由を探していますか?Servlets / JAXP / JDBCなどの低レベルの仕様を使用してRESTfulサービスを開発できますが、これには通常、JAX-RS / JAXB / JPAなどの高レベルの仕様よりも多くのコードが含まれます。
bdoughan 2011

回答:


72

なぜJAX-RS / Jerseyを使用するのですか?

短い答え

それはRESTfulサービスの開発を容易にするからです。

長い答え

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

JAX-RSはJavaEEの一部であり、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();
    }

}

詳細については:


ここで「セッションBean」という用語は誤解を招く恐れがあります。コードが示すように、RESTfulエンドポイントはステートレスであると想定されています。セッションは保持されていません。
ファイ

それで、JSON変換はGlassFishサーバーでのみ利用可能であるというあなたの意見に基づいて、JAX-RSはよりXMLフレンドリーですか?ありがとう
ピクセル

Springbootとの違いについて誰かコメントできますか?なぜ一方を他方の上に使用するのですか?ありがとう
ピクセル

58

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

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

JAX-RSは、RESTfulWebサービス用のJavaAPIを定義するJSR仕様です。

ジャージーはJAX-RSの特定の実装です。

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


12
+1追記:JAX-RSの使用は、サーブレットを使用して独自のReSTful実装をロールするよりもはるかに簡単であることがほぼ保証されています。それが全体のポイントです。
ライアンスチュワート

@ライアン、ドン:それがこの質問の全体の目的です-上記の活動を容易にするためだけにジャージーが必要ですか?そして私はJAX-RSとは何かを知っています、なぜJavaの人々がこれのために別々のAPIを提供しているのか知りたいのです... PHPは何も提供していませんでしたが、それでも彼らはうまくやっているようです。
WinOrWin 2011

7
@WinOrWin:アセンブリですべてを行うこともできるのに、なぜJavaを使用するのですか?私が言えるのは、ReSTful APIを双方向で記述し、どちらを何度も実行するかを決定することだけです。
ライアンスチュワート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.