使用 JAX-RS Jersey 2 和 Grizzly 的 Swagger 文档

2024-01-30

我已经使用 JAX-RS 实现了 Rest Web 服务(该功能不相关)。现在我想使用 Swagger 生成其文档。我已按照以下步骤操作:

1) In build.gradle我得到了我需要的所有依赖项:

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

2)我用 Swagger 注释来记录我的代码

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,我得到这个输出。

你可以查看我的公共仓库here https://github.com/Santi-7/Laboratory-3-Restful-Web-Services.


在这样的时候(当问题没有真正的解释时)我会抛出一个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);
}

当您再次运行应用程序并尝试到达端点时,您现在将看到包含异常原因的堆栈跟踪

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

如果你看一下源代码 https://github.com/swagger-api/swagger-core/blob/v1.5.0/modules/swagger-jaxrs/src/main/java/io/swagger/jaxrs/listing/ApiListingResource.java#L90 for ApiListingResource.java:90, 你会看见

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

这里唯一可能导致 NPE 的是context, which 向上滚动 https://github.com/swagger-api/swagger-core/blob/v1.5.0/modules/swagger-jaxrs/src/main/java/io/swagger/jaxrs/listing/ApiListingResource.java#L42会告诉你这是ServletContext。现在这就是它为空的原因。为了让那里甚至be 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

See the API for GrizzlyWebContainerFactory https://jersey.java.net/apidocs/2.8/jersey/org/glassfish/jersey/grizzly2/servlet/GrizzlyWebContainerFactory.html for other configuration options.

现在,如果您运行它并再次点击端点,您将看到 Swagger JSON。请注意,来自端点的响应只是 JSON,而不是文档接口。为此,您需要使用可以解释 JSON 的 Swagger UI。

感谢您的MCVE https://stackoverflow.com/help/mcve顺便说一句,项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JAX-RS Jersey 2 和 Grizzly 的 Swagger 文档 的相关文章

随机推荐

  • ORA-00907: 缺少右括号

    过去两天我一直在查看这段代码 但似乎无法让它工作 它不断地给我 ORA 00907 missing right parenthesis 我知道这是一个经常出现的话题 但由于某种原因 我见过的例子都没有对我有帮助 有人可以告诉我为什么会出现此
  • 在 Google BigQuery API 中,查询响应的默认超时是多少?

    在 Google BigQuery API 中 查询响应的默认超时是多少 换句话说 对于未完成的作业 默认等待多长时间直到响应返回 null 的文档timeoutMs https cloud google com bigquery docs
  • Mongodb 与 Python 的“set()”类型

    我正在构建一个以 mongoDB 作为后端的网络应用程序 某些文档需要将项目集合存储在某种列表中 然后系统需要经常检查该列表中是否存在指定的项目 使用 Python 的 in 运算符需要 Big O N 时间 n 是列表的大小 由于这些列表
  • SQL Server 和消息队列

    我正在尝试构建一个可靠的消息服务 或者至少我是这么描述它的 这是我的问题 我有一个表 我将数据插入到该表中 我至少有两个应用程序从该表中选择数据 但是 我需要一种可靠的方法 让两个不同的应用程序在任何给定时间都不会选择相同的行 我将如何编写
  • 无法通过多重采样渲染到纹理

    我运行了帧缓冲区示例this http www open gl framebuffers page 原始代码 http www open gl content code c6 base txt 在osx 10 8中的xcode 4 6中使用
  • 在 R 中使用插入符号进行逐步回归[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在R中使用了leaps包来执行前向和后向特征消除 但是 我希望自动化交叉验证和预测操作 因此 如何在插入符号中使用向前 向后选择 在
  • 图像检测功能:SIFT、HISTOGRAM 和 EDGE

    我正在致力于使用 3 种不同的功能 即 SIFT HISTOGRAM 和 EGDE 来开发对象分类器 然而 这 3 个特征具有不同的维度向量 例如SIFT 128 维 历史记录 256 现在 由于大小不同 这些特征无法连接成一个向量 我打算
  • 由于资源文件权限被拒绝,Cocos2D-x HelloCpp for Android 无法从 Windows 构建 apk

    我试图在 Android 上运行 cocos2dx HelloCpp 示例项目 从 Windows 7 64 位和 Cygwin 64 位构建 但是 每次我尝试构建和运行时 它都会抱怨资产中的 Marker Felt fnt 文件的权限被拒
  • Heroku 上的 Flask:request.form 对于大量 POST 数据非常慢?

    我正在 Heroku 上使用带有 eventlet 工作人员的 Gunicorn 运行 Flask 应用程序 我的应用程序上的特定路由经常接收 POST 数据 x www form urlencoded 其中包含一些相当大的字段 最多大约
  • 导入 httplib 导入错误:没有名为 httplib 的模块

    运行 test py 时出现此错误 C Python32 gt python exe test py Traceback most recent call last File test py line 5 in
  • 将带有嵌入括号的字符串转换为字典

    从如下所示的字符串构建字典的最佳方法是什么 key1 value1 key2 value2 key3 value with spaces 所以键始终是不带空格的字符串 但值是字符串或大括号中的字符串 有空格 你会如何把它写成 key1 va
  • Docker 和 Chromium net::ERR_NETWORK_CHANGED

    我有一个 AngularJS 应用程序 它执行 ajax 调用 但会导致 chromium 错误 net ERR NETWORK CHANGED 我尝试禁用任何我不需要的适配器 我有多个容器和多个正在运行的 dockers 容器 我在每个适
  • 如果 Kotlin 中的类型参数受另一个类型参数限制,为什么它不能有任何其他限制?

    这是显示此问题的最小演示代码 interface A fun
  • 为什么 WebStorm 实时编辑在 Chrome 中不起作用?

    我正在探索 WebStorm 的试用版 并希望使用 LiveEdit 功能 执行以下操作后 我无法使用 LiveEdit 功能 确保 LiveEdit 已打开 安装了 Chrome 扩展程序 安装扩展后重新启动浏览器 我仍然怀疑它不是必需的
  • PySpark DataFrame - 动态连接多个列

    假设我在 Spark 上有两个 DataFrame firstdf sqlContext createDataFrame firstdf id 1 firstdf column1 2 firstdf column2 3 firstdf co
  • 该方法对于错误类型不明确

    我试图了解 JAVA 中的重载是如何工作的 并试图掌握在 JAVA 中加宽 自动装箱和可变参数的情况下应用的各种重载规则 我无法理解以下场景中发生的情况 package package1 public class JustAClass pu
  • 如何手动修复npm漏洞?

    当我跑步时npm install它说found 33 vulnerabilities 2 low 31 moderate run npm audit fix to fix them or npm audit for details 然而 n
  • x:样式中的Key & TargetType

    使用此语句有什么区别 或优点 Style x Key x Type DataGridCell TargetType x Type DataGridCell 省略x Key属性 我认为 WPF 将密钥分配给相同的x Type在引擎盖下 MSD
  • jQuery:this.attr() 不是一个函数?

    我不太确定我是否没有在正确的范围内使用它或什么 但我有一个脚本 它基本上捕获链接单击并导致页面在转到链接页面之前淡出 但是 如果链接是 JavaScriptonclick 脚本失败 这是我的代码
  • 使用 JAX-RS Jersey 2 和 Grizzly 的 Swagger 文档

    我已经使用 JAX RS 实现了 Rest Web 服务 该功能不相关 现在我想使用 Swagger 生成其文档 我已按照以下步骤操作 1 In build gradle我得到了我需要的所有依赖项 compile org glassfish