JAX-RS со встроенным сервером - PullRequest
16 голосов
/ 26 ноября 2011

Пояснение: этот вопрос касался GZIP-создания службы REST на основе JAX-WS, но я решил изменить тему, чтобы упростить поиск

Я внедряю службу REST через JAX-WS Provider <Source> и публикую ее со стандартом Endpoint (причина в том, что я хочу избегать использования контейнера сервлета или сервера приложений).

IsЕсть ли способ заставить сервер отправлять содержимое ответа gzip, если присутствует Accept-Encoding: gzip?


HOW-TO

Образцы, предоставленные nicore, действительно работают, и это позволяет вамсделать сервер в стиле JAX-RS поверх встроенного облегченного сервера без контейнера сервлетов, но есть несколько моментов, на которые следует обратить внимание.

Если вы предпочитаете управлять классами самостоятельно (и экономить время при запуске), выможет использовать следующее:

Пример

JAX-RS hello world class:

@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();
    }
}

Разрешенные зависимости:

Простой:

Grizzly:

Джерси:

Notice

Убедитесь, что архив javax.ws.rs не попал в ваш путь к классам, поскольку он конфликтует с реализацией Jersey.Хуже всего здесь - тихая ошибка 404 без регистрации - регистрируется только небольшая заметка на уровне FINER.

Ответы [ 3 ]

16 голосов
/ 26 ноября 2011

Если вы действительно хотите сделать REST с Java, я бы предложил вам использовать реализацию JAX-RS (RESTeasy, Джерси ...).

Если ваша основная проблема заключается в зависимости от контейнера сервлета, вы можете использовать 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 .

Использование 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 из коробки, но сейчас я не могу вспомнить его.

0 голосов
/ 26 ноября 2011

Если вы используете CXF для реализации JAX-WS (или JAX-RS), вы можете просто добавить аннотацию @GZIP к классу обслуживания.

0 голосов
/ 26 ноября 2011

gzipping выходные данные - это ответственность реализации JAX WS. Вы должны обратиться к документации сервера (Tomcat, Glassfish, JBoss и т. Д.), Чтобы настроить свои прослушиватели сети http.

...