首页 文章

使用带Swagger的多个JAX-RS应用程序类

提问于
浏览
5

我正在尝试在具有两个Application类的Java应用程序上实现Swagger,因为一个处理"public" Web服务而另一个处理"admin" Web服务 . 我正在尝试生成两个单独的swagger.json文件,每个文件对应一个Application类 . 但是,两个URL中只生成其中一个 . 这是一些代码:

公共应用类:

@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);
    }
}

现在,如果我点击这些网址中的任何一个,我会得到相同的“公共”swagger json文件:

我究竟做错了什么?

感谢所有阅读的人!

1 回答

  • 5

    默认情况下,Swagger会对扫描仪和配置进行一次初始化 . 如果您有多个应用程序或配置,则需要通过 BeanConfig 为每个应用程序设置configId,scannerInd和contextId,这应该与servlet配置中的值匹配 . 这个设置只适用于最新版本的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);
    }
    

    您还应该将servlet config中的configId,contextId和scannerIdd指定为init参数,如下所示 .

    <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>
    

相关问题