web-dev-qa-db-ja.com

組み込みサーバーを備えたJAX-RS

説明:この質問は、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レベルの小さなメモのみがログに記録されます。

17

本当にやりたい場合は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を開始する方法も確かにありますが、現時点では思い出せません。

17
nre

JAX-WS実装(またはJAX-RS)にCXFを使用している場合は、@ GZIPアノテーションをサービスクラスに追加するだけで済みます。

0
Daniel Kulp

出力をgzipするのは、JAXWS実装の責任です。 httpネットワークリスナーを設定するには、サーバー(Tomcat、Glassfish、JBossなど)のドキュメントを参照する必要があります。

0
andbi