JAX-RS с Jersey & Grizzly: 500 запросов не удалось выполнить для всех запросов

Hi

Мне нужно разработать простой веб-сервис на java. Я новичок в технологии Java и на основании нескольких статей решил использовать JAX-RS (Джерси) со встроенным http-сервером (Grizzly2), поскольку он выглядит подходящим для создания служб REST, а развертывание кажется тривиальным.

В моей среде разработки все работает идеально (с использованием IntllijIdea).

Но когда я пытаюсь развернуть на тестовом сервере, каждый запрос возвращает «500 Internal Error» (даже /application.wadl)

Здесь больше информации:

Простой ресурс

@Path("resource")
public class SpeechRecognition {
    @GET
    public Response test() {
        Logger.getGlobal().log(Level.INFO, "resource test");
        return Response.ok("success", MediaType.TEXT_PLAIN).build();
    }
}

Простая конфигурация ресурса

public class SimpleApiServer extends ResourceConfig {
    public SimpleApiServer() {
        register(MultiPartFeature.class);
        register(LoggingFilter.class);
        register(JacksonFeature.class);

        property(ServerProperties.TRACING, "ALL");
        property(ServerProperties.TRACING_THRESHOLD, "VERBOSE");

        packages("com.mydomain");
    }
}

Простой запуск приложения

public static void main(String[] args) throws IOException {
    final HttpServer server = GrizzlyHttpServerFactory.createHttpServer("http://0.0.0.0:80", new SimpleApiServer());

    System.out.println(String.format("Jersey app started with WADL available at "
            + "%sapplication.wadl\nHit enter to stop it...", serverUri.toString()));
    System.in.read();
    server.stop();
}

Отображение исключений

@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable ex) {
        Logger.getGlobal().log(Level.WARNING, "exception response");

        ex.printStackTrace();

        return Response.status(500).entity(Exceptions.getStackTraceAsString(ex)).type("text/plain")
            .build();
    }
}

Что случилось

Для каждого запроса, который я вижу в консоли

- что гризли его принимает (выводит всю информацию о заголовках и т. д.) - и этот код ресурса выполняется (выводится "тест ресурса")

And nothing more.

В почтальоне я получаю "500 Request Failed" без следа от Джерси в заголовках (хотя я указал свойство (ServerProperties.TRACING, "ALL");)

В консоли сервера не печатается информация о каких-либо исключениях.

У меня есть идея, что что-то плохое происходит, когда майка пытается передать ответ гризли.

У кого-нибудь есть какие-либо мысли о том, где я должен искать, чтобы устранить эту проблему? Я действительно застрял с этим.

И я действительно не хочу переписывать все (не этот простой плохой пример, а многое другое) в традиционный код, ориентированный на сервлет Java (потому что это еще одна технология, о которой нужно узнать)

P.S.

Тестовый сервер — это док-контейнер на виртуальной машине azure linux. Запросы передаются nginx на открытый порт докера. Получил сайт на Rails по той же схеме, работает нормально.

Когда гризли выводит информацию о запросе, он выводит неверное имя хоста. т.е. фактическое имя хоста — test.api.mydomain.com, и гризли пишет GET http://test.api:80/resource


person Alex Shtuk    schedule 08.11.2015    source источник


Ответы (1)


Хорошо.
Это было несоответствие версии Джерси в средах разработки и тестирования.

Удаленная отладкаIntellijIdea) показал, что в процессе формирования ответа

Exception: AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType;

брошено, что привело меня к этому сообщению.
После исправления зависимостей все работает нормально.

person Alex Shtuk    schedule 09.11.2015