swagger JSON 文件上的空值

2024-04-12

我在处理通过 Java 注释生成的 JSON swagger 文档时遇到了一些问题(REST 使用 Jersey 公开,序列化由 Jackson 处理)。查看生成的Swagger,它包括null值,这会导致 swagger UI 崩溃(生成的 YAML 不存在此问题)。

以下是 JSON 的摘录:

{
  "swagger": "2.0",
  "info": { "description": null, "version": "1.0.0", "title": "", "termsOfService": null, "contact": null, "license": null },
  "host": "localhost:8080",
  "basePath": "/api",
  "tags": [ { "name": "dataset", "description": null, "externalDocs": null } ],
  "schemes": [ "http" ],
  "consumes": null,
  "produces": null,
  "paths": {
    "/dataset": {
      "get": {
        "tags": ["dataset"],
        "summary": "A dataset",
        "description": "All the available datasets",
        "operationId": "datasetGet",
        "schemes": null,
        "consumes": null,
        "produces": ["application/json"],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Available datasets",
            "schema": {
              "type": "object",
              "format": null,
              "example": null,
              "xml": null,
              "position": null,
              "description": null,
              "title": null,
              "readOnly": null,
              "additionalProperties": {
                "type": "object",
                "format": null,
                "example": null,
                "xml": null,
                "position": null,
                "description": null,
                "title": null,
                "readOnly": null,
                "additionalProperties": {
                  "type": "object",
                  "format": null,
                  "example": null,
                  "xml": null,
                  "position": null,
                  "description": null,
                  "title": null,
                  "readOnly": null,
                  "properties": null
                }
              }
            },
            "examples": null,
            "headers": null
          }
        },
        "security": null,
        "externalDocs": null,
        "deprecated": null
      },
      "head": null,
      "post": null,
      "put": null,
      "delete": null,
      "options": null,
      "patch": null,
      "parameters": null
    }
  },
  "parameters": null,
  "responses": null,
  "externalDocs": null,
  "securityRequirement": null
}

这个解决方案 https://stackoverflow.com/questions/11757487/how-to-tell-jackson-to-ignore-a-field-during-serialization-if-its-value-is-null建议设置对象映射器以省略null解决问题的价值,但现实是我不知道在哪里或如何轻松访问映射器,并使用NON_NULLREST 服务类上的注释毫无意义。类似的问题已被询问 https://stackoverflow.com/questions/33227114/swagger-json-produces-null-value-it-stops-ui以及,但我不使用Spring(所以我没有地方设置自定义映射器或设置)。

我过去使用过Swagger,但使用了不同的配置设置(与wink结合,现在我使用Jersey)并且没有这个问题。

如果有一些明显的配置错误,这是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>MyProject</display-name>

    <!-- Rest services mapping -->
    <servlet>
        <servlet-name>jersey</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            io.swagger.jersey.listing.ApiListingResourceJSON,
            org.something.DatasetApi
        </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>

    <!-- Swagger config class -->
    <servlet>
        <servlet-name>DefaultJaxrsConfig</servlet-name>
        <servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0.0</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/api</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <!-- Just the CORS filter -->
    <filter>
        <filter-name>ApiOriginFilter</filter-name>
        <filter-class>org.something.ApiOriginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ApiOriginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

这是我的 pom.xml (我总是对 swagger 依赖项感到困惑):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <groupId>org.something</groupId>
    <artifactId>my_project</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>
    <name>My Project</name>
    <url>http://maven.apache.org</url>

    <build><finalName>MyProject</finalName></build>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.6</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core" -->
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- Required only when you are using JAX-RS Client -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- scope>provided</scope -->
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.4.2</version>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-jersey2-jaxrs</artifactId>
            <version>1.5.4</version>
        </dependency>

    </dependencies>


</project>

最后,为了完整起见,这是我的 Java 类的摘录:

package org.something;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Path("/dataset")
@Produces({ "application/json" })
@Api(value = "/dataset", description = "the dataset API")
public class DatasetApi  {

    private static final Logger log = LoggerFactory.getLogger(DatasetApi.class);

    @GET
    @ApiOperation(value = "All the available datasets.", notes = "Available datasets", response = Map.class, responseContainer = "Map")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "Map of the available datasets", response = Map.class, responseContainer = "Map") })
    public Map<String, String> datasetGet() {
        try {
            log.info("Returning list of dataset");
            return Storage.datasets().getDatasets();
        } catch(Exception e) {
            log.info("Exception!", e);
            throw new WebJsonException(e, Response.Status.INTERNAL_SERVER_ERROR);
        }
    }

}

理想情况下,我想要一个类,它要么在之前调用,要么包装 swagger 逻辑(通过在web.xml)并做了一个简单的mapper.setSerializationInclusion(Include.NON_NULL);这解决了所有的麻烦,但我不知道这是否以及如何可能。


我花了一周的时间,在发布问题后几个小时就找到了解决方案,对此感到抱歉。

看来在web.xml缺少了io.swagger.jaxrs.listing.SwaggerSerializersServletContainer 中的类,完整部分是:

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        io.swagger.jersey.listing.ApiListingResourceJSON,
        io.swagger.jaxrs.listing.SwaggerSerializers,
        org.something.DatasetApi
    </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

随着io.swagger.jaxrs.listing.SwaggerSerializers现在一切都按预期进行。

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

swagger JSON 文件上的空值 的相关文章

  • Java:提取具有多个子目录的zip文件[重复]

    这个问题在这里已经有答案了 我有一个 zip Meow zip 它有多个文件和文件夹 如下所示 Meow zip 文件 txt 程序 exe Folder 资源 xml AnotherFolder OtherStuff 更多资源 xml 我
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • Java 中的原始数据类型是线程安全的吗

    原始数据类型是这样的吗int shortJava 线程安全 我执行了以下代码 有时看不到预期结果 500 public class SampleThree extends Thread static long wakeUpTime Syst
  • 使用java进行JSON模式验证[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在为返回 JSON 对象的 java webapp 编写一些验收测试 我想验证返回的 JSON 是否针对架构进行验证 任何人都可以建议
  • Spring - 是否可以获取所有使用@ComponentScan注册的包?

    是否可以获取使用 ComponentScan 注册的所有包的列表 我需要知道 我的 Spring Boot 应用程序中已经注册了哪些 root 包 可能的解决方案 在运行时扫描Java注释 https stackoverflow com q
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • System.out 什么时候不会出现在 Java 控制台中?

    我明白任何要标准化的东西 System out 将出现在 Java 控制台窗口中 启用时 我在某个地方发现 在某些情况下可能无法尝试这样做 例如 在 Swing 应用程序中 是这样吗 基本上 什么情况或设置我不希望在控制台中看到标准输出 例
  • TarsosDSP 音高分析傻瓜式教程

    我正在开发一个分析声音文件音调的程序 我遇到了一个非常好的 API 称为 TarsosDSP 它提供了各种音高分析 然而 我在设置它时遇到了很多麻烦 有人可以向我展示一些有关如何使用此 API 特别是 PitchProcessor 类 的快
  • 将 uiautomator 测试用例与 Android 中的应用程序代码集成

    我正在使用 Eclipse IDE 这是我的 uiautomator 测试用例代码 public class caltest extends UiAutomatorTestCase public void testDemo throws U
  • 记录中嵌套 Spring 配置(ConfigurationProperties)

    如何绘制一张地图application yaml将嵌套属性配置为 Java 中类似的记录结构 例如 如果我们有以下 yaml foo bar something 42 baz otherThing true color blue 所需的记录
  • Spring方法获取给定类型的所有bean

    我试图从一个相同类型的豆子中获取所有豆子FileSystemXmlApplicationContext 我正在使用factory getBeansOfType SomeType class 但我注意到它只返回顶级 bean 是否有任何其他方
  • Struts 2 - 使用 CKEditor 拦截上传的图像文件

    我有一个CKEditor在网站的不同页面上 所以我将上传内容设置为true以及让它工作的所有配置内容 并且图像上传工作得很好 Send it to the Server 标签 但从这里我想拦截或互动upload函数能够将图像上传到文件夹中
  • 更新写入 java 文本文件的对象

    将 Java 对象或列表写入文本文件是可以的 但我想知道如何更新或重写以前写入的对象而不再次写入对象 例如 假设有一个 java util List 有一组对象 然后将该列表写入文本文件 然后稍后该文件将被再次读取并从列表中获取所有对象 然
  • 如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

    有没有人尝试过在 spring boot 中禁用 mongodb 的自动配置 我正在尝试使用 spring data mongodb 来启动 spring boot 使用基于java的配置 使用 spring boot 1 2 1 RELE
  • 如何在运行时更改 JList 的单元格图标

    如何更改仅一个 JList 单元格的 JLabel 图标 例如 在 JList 中单击 我尝试访问使用 listCellRender 获取的 JLabel 但它不起作用 Override public void valueChanged L
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • 从自定义类导入时,XMLBeans jar 无法签名

    在 NetBeans 中 我创建了一个 Exporter 类 该类使用 APACHE POI 将一些数据导出到 EXCEL 文件 而 APACHE POI 使用 XMLBeans 我通过下载 zip 二进制文件并手动添加 jar 来添加 A
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • 在文件中查找一行并将其删除

    我正在寻找一个小代码片段 它将在文件中找到一行并删除该行 不是内容而是行 但找不到 例如 我在以下文件中 我的文件 txt aaa bbb ccc ddd 需要有这样的功能 public void removeLine String lin
  • 使用 HttpClient 在 java 中进行连接池 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 HttpClient 创建连接池 我必须频繁连接到同一台服务器 值得创建这样一个池吗 是否可以保持 HTTP 连接处于活动状

随机推荐

  • .net 4.0 中引用类型的 volatile

    我很困惑volatile供参考类型 据我了解 对于原始类型 volatile可以立即反映来自另一个线程的值变化 对于引用类型 可以立即反映地址变化 但是 对象的内容呢 它们仍然被缓存吗 假设List Add 是一个原子操作 例如 我有 cl
  • React Native:执行 UI 块时抛出异常

    我正在构建一个 iOS React Native 应用程序 目前正在使用 React Native swipe card 包为我的应用程序构建 tinder 例如刷卡 该应用程序工作正常 但是当我向左或向右滑动卡片 并在它离开屏幕一半时放开
  • 如何在rails控制器中获取上传文件的文件名

    在我的控制器中 如果我根据建议给出以下内容 filename params upload result filename original filename 我正进入 状态 undefined method original filenam
  • Python 是否有相当于 Java 的 AWT Robot 类? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道类似的Python类Java机器人 http java sun com javase 6 docs api java awt Ro
  • WPF DataGrid - 禁用时保留选择

    我已经为此苦苦挣扎了一段时间了 我的应用程序中有一个 主 详细信息 布局 并且像许多其他人一样面临着 DataGrid 在禁用它时丢失其选择的问题 本质上 从列表中选择一个元素来填充一系列字段后 用户按下 编辑 这会禁用 DataGrid
  • ical导出的格式化时间

    我在 jquery 中创建了一个导出到 ical 的日历 但是 我对日期时间有一些问题 ical 导出脚本需要以下格式的日期 时间 19970714T170000Z 有谁知道这是什么以及我应该如何准备我的字符串 Thanks 阅读 RFC
  • 'effect' 在 jsfiddle 中工作正常,但在实时代码中不起作用([object Object] 没有方法 'effect' )

    相关 但不是修复 jQuery 问题 没有方法 https stackoverflow com questions 2988485 jquery issue an object has no method 我收到错误Object objec
  • for 循环范围不起作用 ksh

    我试过这个 bin ksh for i in 1 10 do echo Welcome i times done 在 AIX 机器的 Ksh 中 我得到的输出为 欢迎 1 10 次 这是怎么回事 不是应该打印从1到10吗 编辑 根据 per
  • Windows 上的正则表达式 PCRE

    如何在 Windows 上安装 regex pcre cabal install regex pcre Resolving dependencies Configuring regex pcre 0 94 4 cabal Missing d
  • Dapper SqlMapperExtensions / Dapper.Contrib?

    好像有一个DapperExtensions项目 但是Dapper项目中还有一个SqlMapperExtensions类 有重叠吗 其中一个比另一个更受青睐吗 我找不到有关 Dapper Contrib 的任何文档 Dapper Contri
  • 用于运行异步请求的 Python Celery 与线程库 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在运行一个解析大量数据的 python 方法 由于它是时间密集型的 我想在单独的线程上异步运行它 以便用户仍然可以访问网站 UI 如果用户退
  • 如何关闭 AWS S3 客户端连接

    关闭 aws s3 客户端连接的协议是什么 Override public boolean connect if connected return false else s3Client new AmazonS3Client credent
  • Python:检查目录是否是别名

    python 是否有一个简单的函数来检查目录是否是实际目录或者它是否只是另一个目录的别名 我试图列出目录中的所有文件 文件夹 但由于这些别名文件夹 我丢失了如下所示的内容 系统 库 Java JavaVirtualMachines 1 6
  • 我应该如何处理 WiX 安装程序中的产品升级?

    我有一个相当大的 WiX 安装程序 250 Mb 以上 我正在尝试制定合适的升级策略 安装程序中的大多数文件都不会更改 并且当只有一两个文件发生更改时 我们不希望分发整个包 我研究了主要和次要升级 我的理解是 如果产品 ID 发生变化 只要
  • 如何使用 Node JS / Webdriver.io / Chimp 打印为 PDF?

    我正在尝试在 Node JS 中使用 Chimp Webdriver io Selenium 来测试我的 media printCSS 确保当人们从我的网站打印时一切都正确显示 如何以编程方式让 Chrome Firefox 打印为 PDF
  • 数据而不是架构的数据库版本/更改控制?

    在阅读了这里和周围的几篇文章后 我意识到开发团队中的数据库版本控制实际上非常重要 到目前为止我一直在使用一个简单的dump whole database每次有更新时 如果只有 1 个表被更改 有时我们只需转储单个表然后重新导入即可 不是最好
  • 使用jquery动态添加文本框

    这段代码有什么问题 只有首先添加和删除链接才有效
  • 需要使用Python进行每日日志轮换(0utc)

    我是公认的 Python 菜鸟 我编写了一个小记录器 它从串行端口获取数据并将其写入日志文件 我有一个小程序 可以打开文件进行追加 写入 然后关闭 我怀疑这可能不是最好的方法 但这是我到目前为止所想到的 我希望能够让它在 00 UTC 自动
  • ap_pass_brigade 在handle_request_ipc 函数中失败

    页面导致 500 错误 日志显示如下 Wed Mar 20 11 19 23 2013 warn client 127 0 0 1 104 Connection reset by peer mod fcgid ap pass brigade
  • swagger JSON 文件上的空值

    我在处理通过 Java 注释生成的 JSON swagger 文档时遇到了一些问题 REST 使用 Jersey 公开 序列化由 Jackson 处理 查看生成的Swagger 它包括null值 这会导致 swagger UI 崩溃 生成的