ホームページ  >  記事  >  Java  >  Java Jersey2の使用法の概要

Java Jersey2の使用法の概要

高洛峰
高洛峰オリジナル
2016-12-17 14:47:321486ブラウズ

はじめに

Jersey は、RESTful Web サービスを構築するための JAX-RS (JSR311) のオープンソース リファレンス実装であり、次の 3 つの部分で構成されています。

Core Server: JSR 311 で標準化されたアノテーションと API 標準化を提供することで、RESTful Web を開発できます。直感的な方法でサービスを提供します。

コアクライアント: Jersey クライアント API は、開発者が RESTful サービスと簡単に通信できるようにします。

統合 (統合): Jersey は、Spring、Guice、および Apache Abdera を簡単に継承できるライブラリも提供します。

この開発ではJersey2.0を使用し、コアサーバーのみを使用します。

Jersey 環境をセットアップする

Maven

org.glassfish.jersey.containersjersey-container-servlet -core org.codehaus.jackson< /groupId> org.codehaus.jackson ;artifactId>jackson-mapper-asl1.9.12org.codehaus.jackson -jaxrs< ;/artifactId> 1.9.12

Jar ファイル方式の紹介

Jersey 開発パッケージから WEB-INF のライブラリ ディレクトリに次のライブラリをコピーします。

サーバー: Jersey-server.jar、jersey-Container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar

クライアント: Jersey-client.jar

common: Jersey-common.jar

json サポート: json をサポートするには、Jersey2.0 で Jackson1.9 を使用する必要があります。

Hello World

以下は Hello World を示します

ステップ 1: HelloResource という名前のリソースを作成します。これは、Http Get リクエストを受け入れ、「Hello Jersey」に応答します

@Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public StringsayHello() { return "Hello Jersey"; }
}

ステップ 2: JAX-RS アプリケーションを作成する

public class APIApplication extends ResourceConfig {
public APIApplication() { / /Load Resource register(HelloResource.class); // データ コンバータを登録します register(JacksonJsonProvider.class);
}
}

ステップ 3: サーベルト スケジューラは、すべての REST リクエストを Jersey コンテナに送信することを目的として、xml ファイルで定義されます。 Jersey Servletの宣言に加えて、JAX-RSアプリケーションを指定する初期化パラメータも定義する必要があります。

JerseyServletorg.glassfish.jersey.servlet.ServletContainer< ;/サーブレットクラス> cn.com.mink.resource.APIApplication/init-param> /servlet-name> /services/*

ステップ 4: テスト プログラム

コマンドターミナルに次のコマンドを入力すると、「Hello Jersey」が表示されます。

curl http://host:port/services/hello

または、ブラウザに次の URL を入力すると、「Hello Jersey」が表示されます

http://host:port/services /こんにちは

リソースを使用する

ルートリソースとサブリソース

リソースは、RESTful サービスの重要な部分であり、HTTP メソッド (GET、POST、PUT、DELETE など) を使用してリソースを操作できます。 JAX-RX では、リソースは POJO を通じて実装され、@Path アノテーションを使用して識別子を形成します。リソースには子リソースを含めることができます。親リソースはリソース コレクションであり、子リソースはメンバー リソースです。

次のサンプルコードでは、

Resourcesは「/services」URIで構成されるリソースのコレクションであり、UserResourceは「/services/user」URIで構成されるメンバーリソースです。

@Path("/services"); public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... }
}

UserResource は " で構成されています/user" URI コレクション リソース、getUser は "/user/{username}" URI で構成されるリソース メソッドです

@Path("/user")public class UserResource { @GET @Path("{username"}) @Produces ("application/ json") public User getUser(@PathParam("username") String userName) { ... }
}

HTTP メソッド

HTTP メソッドは CRUD (作成、読み取り、更新、削除) にマッピングされます。リソースの操作、基本モードは次のとおりです:

HTTP GET: 単一またはリソースのコレクションを読み取り/リスト/取得します。

HTTP POST : 新しいリソースを作成します。

HTTP PUT : 既存のリソースまたはリソース コレクションを更新します。

HTTP DELETE : リソースまたはリソース コレクションを削除します。注釈は、クライアントに返されるデータ識別タイプ (MIME) を指定するために使用されます。 @Produces は、クラス アノテーションまたはメソッド アノテーションとして使用できます。メソッドの @Produces アノテーションは、クラスのアノテーションをオーバーライドします。

MIME タイプを 1 つ指定します

@Produces("application/json")

複数の MIME タイプを指定します

@Produces({"application/json","application/xml"})

@Consumes

@Produces とは逆に、クライアントが送信できる MIME タイプを指定するために使用されます。一般に、複数の MIME タイプを指定することもできます。 @PUT 、 @POST に使用されます。

パラメータアノテーション

パラメータアノテーションは、クライアントによって送信されたデータを取得するために使用されます。この記事では、一般的に使用されるアノテーションのみを紹介します。詳細については、Jersey ユーザー マニュアルを参照してください。

@PathParam

@PathParam を使用して、次のように URI で指定されたルールのパラメーターを取得します。

@GET@Path("{username "})@Produces( MediaType.APPLICATION_JSON)public User getUser(@PathParam("username") String userName) {

...

}


ブラウザが http://localhost/user/jack をリクエストすると、userName値はジャックです。

@QueryParam

@QueryParam GET リクエストでクエリ パラメータを取得するために使用されます。次のようなものです。

@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam( "name ")") 文字列名、@QueryParam ("Age") int Age {

...

}


ブラウザが http:/host: port/user? Name =rose & agge = 25 をリクエストすると、名前の値は Rose 、年齢の値は 25 です。パラメーターのデフォルト値を設定する必要がある場合は、次のように @DefaultValue を使用できます:

@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam(") name") 文字列名、@DefaultValue("26") @QueryParam("age") int age) {

...

}


ブラウザが http://host:port/user?name=rose をリクエストしたとき、名前の値は Rose 、年齢の値は 26 です。

@FormParam

@FormParam は、名前が示すように、POST リクエストのフォーム パラメーターからデータを取得します。例:

@POST@Consumes("application/x-www-form-urlencoded") public void post(@FormParam("name") String name) { // メッセージを保存する}

@BeanParam

たとえば、リクエスト パラメータが多数ある場合、クライアントはユーザーを変更するために PUT リクエストを送信し、そのリクエストには多くのユーザー情報が含まれます。現時点では @BeanParam を使用できます。

@POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) { // ユーザーデータを格納する}

User Bean は次のように定義されます:

@XmlRootElement (name = "user")
public class User { @PathParam("userName) private String userName; @FormParam("name") private String name; @FormParam("telephone") private String Telephone; @FormParam("email" ) private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName } ...
}

パラメータは変更可能ですが、上記のメソッドによりパラメータ構造の調整で問題が発生します。現時点では、次のように @Context アノテーションを使用して UriInfo インスタンスを取得することを検討できます:

@GET

public String get(@Context UriInfo ui) {

MultivaluedMap queryParams = ui.getQueryParameters();
MultivaluedMap pathParams = ui.getPathParameters();
}


は @Context アノテーション ServletConfig 、 ServletContext 、 HttpServlet からも取得できますリクエスト、 HttpServletResponse および HttpHeaders など:

@Path("/")public class Resource { @Context ServletConfig servletConfig; @GET public String get(@Context HttpHeaders hh) Map headerParams = hh.getRequestHeaders(); Map pathParams = hh.getCookies(); }

}


JAX-RS は JAXB の使用をサポートしますXML バインディング用の Java API) JavaBeans は XML または JSON にバインドされ、その逆も同様です。 JavaBean には @XmlRootElement のアノテーションを付ける必要があります。@XmlElement アノテーションのないフィールドには、次のように同じ名前の XML 要素が含まれます。 public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getErrorMsg(String errorMsg) { this.errorMsg; }
}

次に、REST サービスで使用します:

@Path("/user") public class UserResource { @POST @Produces("application/json") public OptionResult create(@BeanParam User user) { ... }

}

最後に、JavaBean を JSON データに自動的に変換するデータ コンバーターを登録します。

public class APIApplication extends ResourceConfig {

public APIApplication() { //Load Model register(OptionResult.class) ; //Load Model OptionResult と同じパッケージを使用 //packages(OptionResult.class.getPackage().getName()); //Load Resource register(UserResource.class); //データ コンバーター register(JacksonJsonProvider.class ; 詳細については、Jersey を参照してください)ユーザーマニュアル

問題の概要

Ajaxリクエスト(POST、PUT、DELETE)がJerseyコンテナにデータを送信できない

問題の説明

SMS プラットフォームの開発では、データの CRUD はすべて Ajax テクノロジーを使用して完了するため、POST、PUT、および DELETE リクエストを使用する必要があります。これら 3 つのリクエストの content-type は「application/x-www-form-urlencoded」です。UTF-8 エンコードが使用されている場合は、「application/x-www-form-urlencoded; UTF-8」になります。 Firefox の tamperdata 拡張機能を使用してプログラムをデバッグする過程で、content-type が「application/x-www-form-urlencoded」の場合、Jersey コンテナは @FormParam アノテーションを通じて送信されたデータを取得できることが判明しました。 content-type が「application/x-www-form-urlencoded; UTF-8」の場合は取得できません。

解決策

最後に、Java FilterとJersey RequestFilterを使用して問題を解決しました。まず、Java フィルタで UTF8 を使用してリクエスト内のデータをエンコードし、次に Jersey RequestFilter でリクエスト オブジェクトのコンテンツ タイプを「application/x-www-form-urlencoded」に変更します。例:

public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request;
}public class RequestFilterimplements ContainerRequestFilter { @ Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString("content-type"); if (headerString != null) { //content-type が "application/x-www-form-" の場合urlencoded" " を実行し、 if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_URLENCODED) } }
}

最後に web.xml に Java を登録します。フィルター (Jersey コンテナーの前に登録される) では、次のように APIApplication に Jersey RequestFilter を登録します:

public class APIApplication extends ResourceConfig {
public APIApplication() {
register(RequestFilter.class);
}
}

手順

: この問題を修正した後、Github の Jersey ソース コード リポジトリで、誰かがこの問題を発見して修正したことがわかりました。詳細については、このディスカッション

を参照してください。



Java Jersey2 の使い方まとめに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。