Подтвердить что ты не робот

JAX-RS со встроенным сервером

Разъяснение: этот вопрос касался GZIPping службы REST на основе JAX-WS, но я решил изменить тему, чтобы было легче найти

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

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


HOW-TO

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

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

Пример

JAX-RS привет мирового класса:

@Path("/helloworld")
public class RestServer {

    @GET
    @Produces("text/html")
    public String getMessage(){
        System.out.println("sayHello()");
        return "Hello, world!";
    }
}

Основной метод:

Для Simple Сервер:

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:

Джерси:

Примечание

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

4b9b3361

Ответ 1

Если вы действительно хотите сделать REST с 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.

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

Ответ 2

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

Ответ 3

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