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