2016-10-31 8 views
3

Я пытаюсь внедрить Swagger в Java-приложение, которое имеет два класса Application из-за того, что речь идет о «публичных» веб-сервисах, а другая касается «admin» web Сервисы. Я пытаюсь создать два отдельных файла swagger.json, по одному для каждого класса Application. Однако только один из них генерируется для обоих URL-адресов. Вот код:Использование нескольких классов приложений JAX-RS с Swagger

Открытый класс Применение:

@WebServlet 
@ApplicationPath("/public") 
public class PublicApplication extends Application { 

    public PublicApplication() { 

     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0"); 
     beanConfig.setTitle("A Fine Title"); 
     beanConfig.setDescription("A Fine Description."); 
     beanConfig.setSchemes(new String[]{"http"}); 
     beanConfig.setBasePath("/api"); 
     beanConfig.setResourcePackage("com.test.rest.resource.external"); 
     beanConfig.setPrettyPrint(true); 
     beanConfig.setScan(true); 
    } 
} 

Частный класс Применение:

@WebServlet 
@ApplicationPath("/admin") 
public class AdminApplication extends Application { 

    public AdminApplication() { 

     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0"); 
     beanConfig.setTitle("Another Fine Title"); 
     beanConfig.setDescription("Another Fine Description."); 
     beanConfig.setSchemes(new String[]{"http"}); 
     beanConfig.setBasePath("/apiTwo"); 
     beanConfig.setResourcePackage("com.test.rest.resource.internal"); 
     beanConfig.setPrettyPrint(true); 
     beanConfig.setScan(true); 
    } 
} 

Теперь, если я ударил один из этих URL-адресов, которые я получаю один и тот же «публичный» файл JSon чванство:

Что я делаю неправильно?

Спасибо всем, кто прочитал!

+0

У меня такая же проблема. Вы нашли решение? – Red

+0

Требования изменились в моем проекте, и эта настройка больше не нужна ... так что нет. В конце концов, мне не нужно было настраивать этот путь. Тем не менее, я, вероятно, буду в будущем, поэтому меня все равно интересует ответ. – risingTide

ответ

3

По умолчанию Swagger выполняет инициализацию сканера и конфигурацию один раз. Если у вас несколько приложений или конфигураций, вам нужно установить configId, scannerId & contextId для каждого вашего приложения через BeanConfig, и это должно совпадать со значениями в вашей конфигурации сервлета. Я думаю, что эти настройки работают только с самыми последними версиями swagger. Я пробовал с swagger-1.5.13. Пример показан ниже.

public class PublicApplication extends Application { 

public PublicApplication() { 

    BeanConfig beanConfig = new BeanConfig(); 
    beanConfig.setVersion("1.0"); 
    beanConfig.setTitle("A Fine Title"); 
    beanConfig.setDescription("A Fine Description."); 
    beanConfig.setSchemes(new String[]{"http"}); 
    beanConfig.setBasePath("/api"); 
    beanConfig.setResourcePackage("com.test.rest.resource.external"); 
    beanConfig.setPrettyPrint(true); 

    // Set configId,contextId & scannerId 
    beanConfig.setConfigId("public"); 
    beanConfig.setContextId("public"); 
    beanConfig.setScannerId("public"); 
    beanConfig.setScan(true); 

} 

Ваш AdminApplication класс

public AdminApplication() { 

    BeanConfig beanConfig = new BeanConfig(); 
    beanConfig.setVersion("1.0"); 
    beanConfig.setTitle("Another Fine Title"); 
    beanConfig.setDescription("Another Fine Description."); 
    beanConfig.setSchemes(new String[]{"http"}); 
    beanConfig.setBasePath("/apiTwo"); 
    beanConfig.setResourcePackage("com.test.rest.resource.internal"); 
    beanConfig.setPrettyPrint(true); 

    // Set configId,contextId & scannerId 
    beanConfig.setConfigId("admin"); 
    beanConfig.setContextId("admin"); 
    beanConfig.setScannerId("admin"); 
    beanConfig.setScan(true); 
    beanConfig.setScan(true); 
} 

Вы должны также указать configId, ContextID & scannerId в вашем сервлет конфигурации в качестве параметра инициализации, как показано ниже.

<servlet> 
    <servlet-name>jersey-rest-public</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.test.rest.resource.PublicApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.scanner.id</param-name> 
     <param-value>public</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.context.id</param-name> 
     <param-value>public</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.config.id</param-name> 
     <param-value>public</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>jersey-rest-admin</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.test.rest.resource.AdminApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.context.id</param-name> 
     <param-value>admin</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.scanner.id</param-name> 
     <param-value>admin</param-value> 
    </init-param> 
    <init-param> 
     <param-name>swagger.config.id</param-name> 
     <param-value>admin</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
+0

Когда я устанавливаю configId, contextId & scannerId, этот раздел сгенерированного чванства исчезает. Любая идея почему? ' "Информация": { "Описание": "определение API v1.0", "версия": "1,0", "Название": "API v1.0" }, «BasePath ":" /api/1.0 ",' – Red

+0

Вы установили ту же информацию в конфигурацию сервлета и 'BeanConfig'? –

+0

@Red Убедитесь, что вы устанавливаете contextId, configId & scannerId в 'BeanConfig'. –