当前位置: 首页 > 知识库问答 >
问题:

swagger JSON文件上的值为空

阎志义
2023-03-14

我对通过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
}

此解决方案建议将对象映射器设置为省略null值以解决此问题,但实际情况是,我不知道在何处或如何轻松访问映射器,并且在REST服务类上使用non_null注释是毫无意义的。也曾问过一个类似的问题,但我没有使用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>
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);
        }
    }

}

共有1个答案

阚小云
2023-03-14

我花了一个星期的时间来解决这个问题,在我发布问题后几个小时就找到了解决方案,很抱歉。

web.xml中似乎缺少ServletContainer中的io.swagger.jaxrs.listing.swaggerSerializers类,完整的部分是:

<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位,现在一切都按预期工作。

 类似资料:
  • 我上传文件有问题。我正在使用codeigniter框架和dropzone。js上传文件。 我认为: 控制器: 问题是上传的文件返回为空: 数组(1){["upload_data"]= 我试图转储fileToUpload输入的POST值,也是空的。是不是我忽略了什么?

  • 我正在尝试使用file writer写入文件,但值为空: 这是错误按摩: 我希望我说的很清楚,我已经尽力了。。请帮帮我。

  • 我是php新手。我用php制作了一个简单的上传表单。这是我的密码。 它工作正常。但是如果我在没有附加文件的情况下按下提交键,它会显示错误,警告:file_get_contents():第20行的C:\xampp\htdocs\契约db\filetest.php中的文件名不能为空。 我希望上传文件是可选的,因为不是每个用户都有附加的文件。我还希望用户在上传后下载文件而不删除file_get_cont

  • 我想将文件上载到服务器,但数组似乎为空。 我下面的代码有问题吗? PHP代码 Print_r($_FILES['fotos'])向我展示了这个:数组([name]=

  • 问题内容: 我正在使用Tomahawk的fileupload组件上传文件。我已将表单的enctype设置为 我曾经提交表格。 但是bean中的属性是。我在做什么错,我该如何解决? 问题答案: 确保已按照其文档配置。它是负责处理请求并将适当的部分设置为bean属性的人。 也可以看看: 使用JSF上传文件

  • 问题内容: 我正在尝试使用Struts 2文件上传,但是在我看来,它不起作用。下面是我的代码。 : : 我也在尝试设置struts2.multipart.saveDir属性,如您在上面看到的,但是当我阅读服务器日志时,我看到了这一行 而且文件对象为null,因为没有文件…在控制台上打印出来。我无法弄清楚这里出了什么问题。 编辑: : 问题答案: 除了更改(实际上是不必要和危险的)之外,您还没有遵循