[解決済み] なぜJAX-RS / Jerseyを使うのか?
質問
もしRESTが単なるアーキテクチャであり、SOAPのようなプロトコルでないなら、なぜJAX-RSのような仕様が必要なのでしょうか?
私は実際に "サーブレットとHTTP上のRESTfulサービスの違いは何ですか"のような質問をググって、コミュニティの回答を要約すると、私は得ました。
- RESTful サービス開発 (Jersey) はアーキテクチャであり、本質的にサーブレットを使用します。
- JerseyのようなJAX-RS準拠のツールは、XML/JSONデータの容易なマーシャル-アンマーシャルを提供し、開発者を支援します。
- 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();
}
}
詳細はこちら。
関連
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード
-
[解決済み] RESTリソースの命名規則はSingularとPluralのどちらを使用すべきですか?
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] JAX-RSとJerseyでRESTトークンベースの認証を実装する方法
-
[解決済み] オブジェクト内のアイテムの合計数を返すための最良のRESTfulメソッドは何ですか?
-
[解決済み] RESTのPUT/POST/DELETEコールは、規約によって何を返すべきですか?
-
[解決済み] RESTfulな方法でリソースのサーバーサイドメソッドを呼び出す
-
[解決済み] REST - ボディにIDを入れるかどうか?
-
[解決済み] gRPC(HTTP/2)はREST with HTTP/2より速いのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード
-
[解決済み] リソースとエンドポイントの違いは何ですか?
-
[解決済み] RESTfulな方法でリソースのサーバーサイドメソッドを呼び出す
-
[解決済み] JAX-RSとSpring Restの違いについて
-
[解決済み] gRPC(HTTP/2)はREST with HTTP/2より速いのか?
-
[解決済み] RESTful - DELETE レスポンスボディに含まれるべき内容
-
[解決済み] 非推奨APIをクライアントに通知するためのHTTPレスポンスヘッダに関する規約
-
[解決済み] HATEOAS: 絶対URLか相対URLか?
-
[解決済み] ヘッダーやURLにAPIキーを配置する
-
[解決済み] RESTful url の動詞とアクションで最も良いもの/一般的なものは何ですか?