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

Привет

Мне нужно разработать простой веб-сервис на Java. Я новичок в java tech и на основании нескольких статей решил использовать 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();
    }
}

Что происходит

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

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

И больше ничего.

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

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

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

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

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

PS

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам