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