Null-Werte auf swagger JSON-Datei
Ich habe einige Schwierigkeiten mit der JSON-swagger-Dokument generiert durch die Java-annotation (REST ausgesetzt sind, mit Jersey, Serialisierung erfolgt durch Jackson). Blick auf den generierten Gewinn, es enthält null
Werte, die bewirken, dass die swagger-UI zum Absturz zu bringen (die generierten YAML nicht dieses Problem haben).
Hier ein Auszug aus dem 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
}
Diese Lösung vorschlagen, um das Objekt mapper weglassen null
Wert um das Problem zu lösen, aber die Realität ist, dass ich nicht weiß, wo oder wie man auf einfache Weise den Zugriff auf die mapper, und mit NON_NULL
Anmerkungen auf den REST-Dienst-Klasse ist sinnlos. Eine ähnliche Frage wurde gefragt als gut, aber ich glaube nicht, verwenden Frühling (damit ich nicht einen Platz haben, so legen Sie eine benutzerdefinierte mapper oder Einstellung dafür).
Ich verwendet, Schwadronieren in der Vergangenheit, aber mit verschiedenen Einstellungen (kombiniert mit Augenzwinkern, jetzt bin ich mit Jersey) und nicht dieses Problem haben.
In Fall gibt es einige offensichtliche Fehlkonfiguration, das ist mein 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>
- Und das ist meine pom.xml (ich bin immer verwirrt mit swagger Abhängigkeiten):
<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>
Schließlich, der Vollständigkeit halber, dies ist ein Auszug aus meiner Java-Klasse:
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);
}
}
}
Idealerweise würde ich gerne eine Klasse, die entweder genannt wird, vor oder wickeln Sie die swagger-Logik (durch die Deklaration in der web.xml
) und hat eine einfache mapper.setSerializationInclusion(Include.NON_NULL);
die löst alle Probleme, aber ich weiß nicht, ob und wie das möglich ist.
- Werfen Sie einen Blick auf Antwort in dieser Frage (Aktualisiert Teil): stackoverflow.com/questions/33820327/...
- Das habe ich versucht, aber anstatt
ResteasyJackson2Provider
(die ich nicht habe), habe ichio.swagger.jaxrs.json.JacksonJsonProvider
. Sowieso, es funktioniert nicht (code nie genannt wird) und ich vermute, dass es ist, weil der context-paramresteasy.providers
wird nicht anerkannt. Ich weiß nicht, welche parameter zu verwenden (wenn es Sie gibt, ich denke, die Lösung gilt für die ObjectMapper angewendet, um REST-services, und nicht zu stolzieren Antwort).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hab ich verbrachte eine Woche auf, und ich fand die Lösung nur wenige Stunden, nachdem ich gepostet meine Frage, tut mir Leid.
Es scheint, dass in
web.xml
fehlte dieio.swagger.jaxrs.listing.SwaggerSerializers
Klasse in der ServletContainer, die vollständige Teil ist:Mit der
io.swagger.jaxrs.listing.SwaggerSerializers
bit-alles funktioniert jetzt wie erwartet.Wenn mit spring-boot, können Sie in der Anwendung.yml: