【问题标题】:Using Multiple JAX-RS Application Classes with Swagger通过 Swagger 使用多个 JAX-RS 应用程序类
【发布时间】:2016-10-31 20:38:20
【问题描述】:

我正在尝试在具有两个 Application 类的 Java 应用程序上实现 Swagger,因为一个处理“公共”Web 服务,另一个处理“管理”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);
    }
}

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

我做错了什么?

感谢所有阅读的人!

【问题讨论】:

  • 我遇到了同样的问题。你找到解决办法了吗?
  • 我的项目的要求发生了变化,因此不再需要此设置......所以不需要。我最终不需要这样配置。但是,我将来可能会这样做,所以我仍然对答案感兴趣。

标签: java web-services jax-rs swagger swagger-2.0


【解决方案1】:

默认情况下,Swagger 对扫描仪和配置进行一次初始化。如果您有多个应用程序或配置,则需要通过 BeanConfig 为每个应用程序设置一个 configId、scannerId 和 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 配置中指定 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>

【讨论】:

  • 当我设置 configId、contextId &scannerId 时,生成的 swagger 的这一部分消失了。知道为什么吗? "info": { "description": "API v1.0 definition", "version": "1.0", "title": "API v1.0" }, "basePath": "/api/1.0",
  • 您是否在 servlet 配置和 BeanConfig 中设置了相同的信息?
  • @Red 确保您在 BeanConfig 中设置 contextId、configId 和scannerId。
  • 我正在使用 resourceConfig 而不是 Map&lt;String, Object&gt; initparams = new HashMap&lt;String, Object&gt;(); initparams.put("swagger.scanner.id", "v2"); initparams.put("swagger.config.id", "v2"); initparams.put("swagger.context.id", "v2"); addProperties(initparams);
  • @Red,但您是说 Justin Jose 用上面的代码回答问题的方式确实有效?如果它与 web.xml 一起工作,但根本不是最(可以说)优雅的,它仍然是一个有用的工作解决方案。而且我会将问题标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2016-12-15
  • 2022-12-15
  • 2011-01-05
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多