説明:この質問は、JAX-WSベースのGZIPpingに関するものでしたRESTサービスですが、トピックを変更して見つけやすくすることにしました
RESTサービスをJAX-WSProvider <Source>
経由で実装し、標準のEndpoint
で公開しています(理由は、サーブレットコンテナの使用を避けたいためです)またはアプリケーションサーバー)。
Accept-Encoding: gzip
が存在する場合、サーバーが応答コンテンツをgzipで圧縮する方法はありますか?
nicore
によって提供されるサンプルは実際に機能し、サーブレットコンテナなしで組み込み軽量サーバー上にJAX-RSスタイルのサーバーを作成できますが、考慮すべき瞬間はほとんどありません。
自分でクラスを管理したい(そして起動時に時間を節約したい)場合は、以下を使用できます。
JAX-RS hello worldクラス:
@Path("/helloworld")
public class RestServer {
@GET
@Produces("text/html")
public String getMessage(){
System.out.println("sayHello()");
return "Hello, world!";
}
}
主な方法:
シンプル サーバーの場合:
public static void main(String[] args) throws Exception{
DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class);
// The following line is to enable GZIP when client accepts it
resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter());
Closeable server = SimpleServerFactory.create("http://0.0.0.0:5555", resourceConfig);
try {
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
server.close();
}
}
Grizzly2 の場合:
public static void main(String[] args) throws Exception{
DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class);
// The following line is to enable GZIP when client accepts it
resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter());
HttpServer server = GrizzlyServerFactory.createHttpServer("http://0.0.0.0:5555" , resourceConfig);
try {
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
server.stop();
}
}
シンプル:
グリズリー:
ジャージー:
javax.ws.rs
アーカイブは、Jerseyの実装と競合するため、クラスパスに入らないようにしてください。ここでの最悪の事態は、ログが記録されないサイレント404エラーです。FINER
レベルの小さなメモのみがログに記録されます。
本当にやりたい場合はREST with Java JAX-RS実装(RESTeasy、Jersey ...)を使用することをお勧めします。
主な関心事がサーブレットコンテナへの依存である場合は、JAX-RS RuntimeDelegate を使用して、アプリケーションをJAX-RSエンドポイントとして登録できます。
// Using grizzly as the underlaying server
SelectorThread st = RuntimeDelegate.createEndpoint(new MyApplication(), SelectorThread.class);
st.startEndpoint();
// Wait...
st.stopEndpoint();
GZIP
エンコーディングに関しては、JAX-RSプロバイダーごとに異なるアプローチがあります。ジャージーは、エンコーディングを透過的に実行するために フィルター を提供します。 RESTEasy そのための注釈を提供します 。
[〜#〜]編集[〜#〜]
私はいくつかの小さなテストをしました。 Maven を使用していると仮定すると、次の2つのことが確実に機能します。
Jersey + SimpleServerの使用:
public static void main( String[] args ) throws Exception {
Java.io.Closeable server = null;
try {
// Creates a server and listens on the address below.
// Scans classpath for JAX-RS resources
server = SimpleServerFactory.create("http://localhost:5555");
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
try {
if (server != null) {
server.close();
}
} finally {
;
}
}
}
mavenの依存関係
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey.contribs</groupId>
<artifactId>jersey-simple-server</artifactId>
<version>1.10</version>
</dependency>
またはJersey + Grizzly2を使用します:
public static void main(String[] args) throws Exception {
HttpServer server = null;
try {
server = GrizzlyServerFactory.createHttpServer("http://localhost:5555");
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
try {
if (server != null) {
server.stop();
}
} finally {
;
}
}
}
mavenの依存関係
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-grizzly2</artifactId>
<version>1.10</version>
</dependency>
正直言って、私もRuntimeDelegate
サンプルを機能させることができませんでした。箱から出してRESTEasyを開始する方法も確かにありますが、現時点では思い出せません。
JAX-WS実装(またはJAX-RS)にCXFを使用している場合は、@ GZIPアノテーションをサービスクラスに追加するだけで済みます。
出力をgzipするのは、JAXWS実装の責任です。 httpネットワークリスナーを設定するには、サーバー(Tomcat、Glassfish、JBossなど)のドキュメントを参照する必要があります。