2015-11-12 3 views
3

Я реализовал веб-сервис Rest (функция не имеет значения) с использованием JAX-RS. Теперь я хочу создать свою документацию с помощью Swagger. Я следовал за эти шаги:Документация Swagger с JAX-RS Jersey 2 и Grizzly

1) В build.gradle я все зависимости мне нужно:

compile 'org.glassfish.jersey.media:jersey-media-moxy:2.13'

2) Я documentate мой код с чванством аннотациями

3) Я подключить Swagger в моем подклассу Применения:

public class ApplicationConfig extends ResourceConfig { 

    /** 
    * Main constructor 
    * @param addressBook a provided address book 
    */ 
    public ApplicationConfig(final AddressBook addressBook) { 
     register(AddressBookService.class); 
     register(MOXyJsonProvider.class); 
     register(new AbstractBinder() { 
      @Override 
      protected void configure() { 
       bind(addressBook).to(AddressBook.class); 
      } 
     }); 
     register(io.swagger.jaxrs.listing.ApiListingResource.class); 
     register(io.swagger.jaxrs.listing.SwaggerSerializers.class); 

     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0.2"); 
     beanConfig.setSchemes(new String[]{"http"}); 
     beanConfig.setHost("localhost:8282"); 
     beanConfig.setBasePath("/"); 
     beanConfig.setResourcePackage("rest.addressbook"); 
     beanConfig.setScan(true); 
    } 
} 

Однако, при переходе к моей службе в http://localhost:8282/swagger.json я г и этот выход.

enter image description here

Вы можете проверить мой публичный репозиторий here.

+0

Вы пытаетесь получить доступ к вашему 'swagger.json' без контекста приложения. Попробуйте добавить контекст к URL: 'http: // localhost: 8282/app/swagger.json' –

+0

Я получаю 404 с этим URL (используя тот же код). –

+0

Возможно, вы можете получить вдохновение от этого [ответа] (http://stackoverflow.com/a/33669242/1426227). –

ответ

8

Время, подобное этому (когда нет реального объяснения проблемы), что я выбрал ExceptionMapper<Throwable>. Часто с исключениями, связанными с сервером, нет никаких манипуляторов для обработки исключения, поэтому он пузырится до контейнера, и мы получаем бесполезный код состояния 500 и, возможно, какое-то бесполезное сообщение с сервера (как вы видите из Grizzly).

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 

public class DebugMapper implements ExceptionMapper<Throwable> { 

    @Override 
    public Response toResponse(Throwable exception) { 
     exception.printStackTrace(); 
     if (exception instanceof WebApplicationException) { 
      return ((WebApplicationException)exception).getResponse(); 
     } 
     return Response.serverError().entity(exception.getMessage()).build(); 
    } 
} 

Тогда просто зарегистрировать с приложением

public ApplicationConfig(final AddressBook addressBook) { 
    ... 
    register(DebugMapper.class); 
} 

При повторном запуске приложения и пытаться ударить конечную точку, теперь вы будете видеть StackTrace с причиной исключения

java.lang.NullPointerException 
    at io.swagger.jaxrs.listing.ApiListingResource.getListingJson(ApiListingResource.java:90) 

Если вы посмотрите на source code на номер ApiListingResource.java:90, вы увидите

Swagger swagger = (Swagger) context.getAttribute("swagger"); 

Единственное, что может вызвать NPE, это context, в котором будет показано, что это ServletContext. Теперь вот причина, по которой она равна нулю. Для того, чтобы до было a ServletContext, приложение должно быть запущено в среде Servlet. Но посмотрите на свою настройку:

HttpServer server = GrizzlyHttpServerFactory 
     .createHttpServer(uri, new ApplicationConfig(ab)); 

Это не создает контейнер Servlet. Он создает только HTTP-сервер. У вас есть зависимость, необходимая для создания контейнера Servlet (jersey-container-grizzly2-servlet), но вам просто нужно использовать его. Таким образом, вместо предыдущей конфигурации, вы должны сделать

ServletContainer sc = new ServletContainer(new ApplicationConfig(ab)); 
HttpServer server = GrizzlyWebContainerFactory.create(uri, sc, null, null); 
// you will need to catch IOException or add a throws clause 

Смотрите API для GrizzlyWebContainerFactory для других опций конфигурации.

Теперь, если вы запустите его и снова попадете в конечную точку, вы увидите Swagger JSON. Обратите внимание, что ответ от конечной точки - это только JSON, это не интерфейс документации. Для этого вам нужно использовать пользовательский интерфейс Swagger, который может интерпретировать JSON.

Благодарим за проект MCVE BTW.

1

Разведка исправлена ​​в 1.5.7. Это было Issue 1103, но исправление было свернуто в феврале прошлого года. Ответ peeskillet по-прежнему будет работать, но теперь OP будет.